【问题标题】:How to make a function that returns an array with dynamic key names for NodeJS?如何创建一个返回具有 NodeJS 动态键名的数组的函数?
【发布时间】:2012-01-01 14:30:52
【问题描述】:

我正在为 MySQL ORM 开发一个使用 NodeJS、express、express-resource 和 sequelize 构建的 RESTful api。我希望能够检索一组记录并使用 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;
};

现在,这非常低效,因为我必须手动定义要返回的所有数组键。这意味着我必须在我想为 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() 返回的数组中的字段动态映射到推送到返回给调用者的集合的数组?”

【问题讨论】:

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


    【解决方案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']);
    

    【讨论】:

    • 这行得通!谢谢thejh,我应该考虑好的ol .map()。
    猜你喜欢
    • 2012-09-26
    • 2021-09-27
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    • 2021-06-27
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多