【问题标题】:Flattening an array of objects into another array of objects using javascript使用 javascript 将一个对象数组展平为另一个对象数组
【发布时间】:2013-06-06 04:13:54
【问题描述】:

我在多种环境和语言中遇到过这个问题,我总是能够解决这个问题,但我想最终找出一个合适的模式来处理这个问题。它来自连接 SQL 表。通常我会进行两次调用,一次调用 items,一次调用 cmets,但我知道有一种方法可以在一次调用中获取所有内容,然后将结果展平。

我想做的是获取一个如下所示的数组:

[
  {
    itemId: 1,
    comments: {
      commentId: 1
    }
  },
  {
    itemId: 1,
    comments: {
      commentId: 2
    }
  },
  {
    itemId: 2,
    comments: {
      commentId: 3
    }
  }
]

然后把它变成这样:

[
  {
    itemId: 1,
    comments: [
      {
        commentId: 1
      },
      {
        commentId: 2
      }
    ]
  },
  {
    itemId: 2,
    comments: [
      {
        commentId: 3
      }
    ]
  }
]

【问题讨论】:

    标签: javascript arrays design-patterns object


    【解决方案1】:

    以下内容应该适合您:

    function combine(arr) {
        var newObj = {};
    
        // combine the comments
        for (var i=0; i < arr.length; i++) {
            if (newObj[arr[i].itemId]) {
                newObj[arr[i].itemId].push(arr[i].comments);
            } else {
                newObj[arr[i].itemId] = [arr[i].comments];
            }
        }
    
        // make the list
        var keys = Object.keys(newObj);
        return keys.map(function(key){return {itemId: key, comments: newObj[key]} })
    }
    

    【讨论】:

    • 注意Object.keys的顺序没有明确定义,你可能会不小心重新排序。
    • 另请注意Object.keys在IE中不存在,必须添加(es5shim)
    • 另外,由于您已经在使用 ES5,您可能会喜欢Array#map 作为最后一步。它的可读性略高;-)
    • 我想知道itemId 是否保证是数字。否则,如果你非常不走运,你可能会得到一个ID为hasOwnProperty的物品。我觉得值得一提;-)
    • @JanDvorak 这会让我大吃一惊!嘿,OP!你的身份证很正常,对吧?!
    【解决方案2】:

    你也可以使用filter():

    function combine(src) {
        var dict = {};
        return src.filter(function(item) {
            if (!dict[item.itemId]) {
                item.comments = [ item.comments ];
                dict[item.itemId] = item;
                return true;
            } else {
                dict[item.itemId].comments.push(item.comments);
                return false;
            }
        });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-08
      • 2019-10-20
      • 2021-10-16
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      相关资源
      最近更新 更多