Как сделать функцию, которая возвращает массив с динамическими именами ключей для NodeJS?
Я работаю над RESTful api, построенным с помощью NodeJS, express, express-resource и sequelize для MySQL ORM. Я хочу иметь возможность извлекать набор записей и отвечать с помощью res.json(records). Однако я не могу напрямую использовать коллекцию, возвращенную 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 () для каждой модели.найти() модели.финдалл(). В одном из моих контроллеров ресурсов я должен сделать это для нескольких коллекций, что приводит к большому количеству дополнительного кода.
Чтобы сделать это лучше, я пытаюсь создать функцию, которая будет генерировать ключи массива динамически:
/**
* 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']});
Когда я делаю это, у меня возникает ощущение, что я подрываю sequelize ORM в некотором смысле. Итак, мой вопрос: "Как я могу динамически отображать поля из массива, возвращаемого моделью sequelize?findAll() к массиву, который перемещается в коллекцию, которая возвращается в звонивший?"
1 ответ:
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']);