0

我在我当前的项目中使用 underscore.js,它有一个很好的_.groupBy方法。

这将我的数组以这种格式分组。

var obj1 ={
  '0':[{ ... json object...},{ ... json object...},{ ... json object...}],
  '1':[{ ... json object...},{ ... json object...},{ ... json object...}],
  '2':[{ ... json object...},{ ... json object...},{ ... json object...}]
}

var obj2 = {
  '0':[{ ... another json object...},{ ...another json object...}],
  '1':[{ ... another json object...},{ ...another json object...}],
  '2':[{ ... another json object...},{ ... another json object...}]
}

现在我想加入/合并/扩展它们......但_.extend没有像我预期的那样工作。

我的预期结果是

{'0':[{ ... json object...},{ ... json object...},{ ... json object...},{ ... another json object...},{ ...another json object...}],
'1':[{ ... json object...},{ ... json object...},{ ... json object...},{ ... another json object...},{ ...another json object...}],
 '2':[{ ... json object...},{ ... json object...},{ ... json object...},{ ... another json object...},{ ... another json object...}]}

基本上我需要根据 json 键来扩展数组obj1obj2即使内部 json 对象不同。

基本上需要像json对象的sql连接操作......

所以任何帮助都会很棒......

4

2 回答 2

3

好吧,因为没有出现 underscore.js 特定的答案,所以这是一个通用的 JavaScript 答案:

要合并obj2obj1,遍历obj2的条目并将这些数组附加到 上的等效数组obj1,如下所示:

var key, a1, a2;
for (key in obj2) {
  if (obj2.hasOwnProperty(key)) {
    a2 = obj2[key];
    a1 = obj1[key];
    if (a1) {
      a1.push.apply(a1, a2); // Tricky, see below
    }
    else {
      obj1[key] = a2;
    }
  }
}

这合并obj2到,就地obj1修改的数组。如果相应的槽中没有数组obj1,它会重用obj2的数组。obj1

实例| 来源

关于那个“棘手”的位:

a1.push.apply(a1, a2);

这样做是将元素从追加a2a1. 我的博客上的详细信息,但基本上,Array#push将元素添加到数组的末尾,与您指定的参数一样多(例如,a.push(1, 2, 3)推送1、、23到数组上),并Function#apply调用指定使用什么的函数this(第一个参数)以及作为数组(第二个参数)传递给它的参数。

于 2012-12-10T22:36:59.807 回答
1

我需要做类似的事情。加入两个对象,但确保两个 groupby 字段具有相同的名称,san. 我需要scoresome_scores. 需要 _.each 来创建外连接。Map 使用您需要的名称/值创建最终对象:

   var x = _.chain(moves)
            .union(some_scores)    
            .groupBy('san')
            .each(function(o){ o.push({score:''}); })
            .map(function(o){return {san:o[0].san, to:o[0].to, score:o[1].score  }; })
            .value();
于 2016-01-26T15:33:11.840 回答