2012-12-10 51 views
0

我在当前有很好的_.groupBy方法的项目中使用了underscore.js。在下划线组合后加入或合并json对象BY

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

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...}]} 

基本上我需要延长的基础上obj1obj2 JSON的关键,即使内JSON对象是不同的阵列。

基本上会需要像SQL联接的JSON对象操作...

因此,任何帮助将是巨大的......

+1

那些不是JSON对象。他们只是对象。 :-) JSON是一种文本数据表示法(它是您在那里使用的是JavaScript对象初始化器语法的子集)。 (这些例子是完全有效的对象初始化器,但不会是有效的JSON,它需要键和字符串用双引号,而不是单引号。)对不起,不能帮助解决实际问题,我不知道underscore.js,所以我不知道它是否有什么可以帮助你。JavaScript本身并不是,你只需循环,并自己添加数组。 –

+0

好的。谢谢你的提升。这是从下划线组合出来的......这是否影响_.extend方法的任何内容。或者你是否提到了措辞的正确性。感谢您的答复=) – silverfighter

+0

@ silverfighter:只是为了纠正术语,因为有时它很重要。对不起,没有任何与underscore.js的帮助,我不知道它。 (如果您没有看到,我在上面的评论中加了一点。)最好, –

回答

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; 
    } 
    } 
} 

这合并obj2obj1,修改obj1的阵列就位。如果obj1在相应的插槽中没有一个,它将重用obj2的阵列。

Live Example | Source

有关 “刁钻” 位:

a1.push.apply(a1, a2); 

什么,做是追加a2的元素的a1结束。 Details on my blog,但基本上,Array#push添加元素的数组的末尾,多达你指定的参数(如a.push(1, 2, 3)123到阵列),以及Function#apply调用函数指定为this使用什么(第一个参数)以及传递给它的参数,作为一个数组(第二个参数)。

1

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

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(); 
+0

请格式化您的代码 –