Как сделать функцию, которая возвращает массив с динамическими именами ключей для NodeJS? - PullRequest
2 голосов
/ 19 ноября 2011

Я работаю над RESTful API, созданным с использованием NodeJS, express, express-resource и sequelize для MySQL ORM. Я хочу иметь возможность получить набор записей и ответить с помощью res.json (записи). Тем не менее, я не могу напрямую использовать коллекцию, возвращенную sequelize. Когда я пытаюсь, я получаю следующую ошибку:

TypeError: Преобразование круговой структуры в JSON

В качестве обходного пути я создал функцию, которая принимает входные записи и возвращает массив:

/**
 * takes an Array of records and 
 * returns a collection
 *
 * @param {Array} recs
 * @return {Array}
 * @api public
 */
function recs2Array(recs){
    for(var c = 0; c < recs.length; c++){
        var collection = [];
        (function(c){
            // this is crap and must be done for every query
            var data = {
                id: recs[c]['id'],
                gender: recs[c]['gender']
            };
            collection.push(data);
            // debugger;
        })(c);
    };
    return collection;
};

Теперь это ужасно неэффективно, потому что я должен вручную определить все ключи массива, которые должны быть возвращены. Это означает, что я должен использовать этот шаблон везде, где я хочу res.json () для каждой model.find () model.findAll (). В одном из моих контроллеров ресурсов я должен сделать это для нескольких коллекций, получая много дополнительного кода.

Чтобы сделать это лучше, я пытаюсь создать функцию, которая будет генерировать ключи массива динамически:

/**
 * takes an Array of records
 * and and Array of fields and returns 
 * a collection.
 *
 * @param {Array} recs
 * @param {Array} fields
 * @return {Array}
 * @api public
 */
function recs2ray(recs, fields){
    for(var c = 0; c < recs.length; c++){
        fields = fields || null;
        var collection = [];
        (function(c){
            for(var i = 0; i < fields.length; i++){
                (function(i){
                    // how do I create dynamic,
                    // variable key names?
                })(i);
            }
            debugger;
        }
    };
};

К сожалению, я не совсем уверен, как создавать ключи динамического массива. Я думал, что передам предопределенный массив, содержащий поля, которые будут отображены в вызове функции:

var recs = recs2Array(genders, {['id', 'gender']});

Когда я делаю это, я чувствую, что в некотором смысле подрываю секвенирование ORM Итак, у меня такой вопрос: «Как я могу динамически отобразить поля из массива, который возвращается с помощью sequelize model.findAll (), в массив, который передается в коллекцию, которая возвращается вызывающей стороне?»

1 Ответ

3 голосов
/ 19 ноября 2011
var input = ...;
var result = input.map(function(row) {
  var result = {};
  ['id', 'gender'].forEach(function(key) {
    result[key] = row[key];
  });
  return result;
});

Или, если вы хотите сделать это с помощью вспомогательного метода:

function purify(obj, keys) {
  return obj.map(function(row) {
    var result = {};
    keys.forEach(function(key) {
      result[key] = row[key];
    });
    return result;
  });
}
var result = purify(..., ['id', 'gender']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...