如何创建一个返回具有NodeJS动态键名的数组的函数?

时间:2011-11-18 20:54:30

标签: arrays node.js dynamic key sequelize.js

我正在开发一个用NodeJS构建的RESTful api,表达式,快速资源和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;
};

现在,这非常低效,因为我必须手动定义要返回的所有数组键。这意味着我必须在model.findAll()的每个model.find()中使用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']});

当我这样做时,我觉得在某种意义上破坏了续集ORM的感觉。所以,我的问题是,“如何动态地将sequelize的model.findAll()返回的数组中的字段映射到一个数组,该数组被推送到返回给调用者的集合?”

1 个答案:

答案 0 :(得分:3)

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']);