按一个属性对javascript项进行分组

我的问题与这个问题有关。 你必须先阅读它。

var ids = "1*2*3"; var Name ="John*Brain*Andy"; var Code ="A12*B22*B22"; 

现在我有一个javascript对象数组。 我想基于CODE对我的对象进行分组。 因此该代码字符串中可能存在重复的代码。

根据上面改变的字符串,我和Brain和Andy有相同的代码。 所以,现在我想要两个数组。 在一个对象中,只有一个对象包含只有John的细节,在另一个对象中将有两个对象包含Brain和Andy的细节。

仅举例来说,我已经拍摄了3件物品。 实际上可以有很多,也可以有许多不同的代码。

UPDATE
我需要像@Pointy那样构建在groupMap对象中的结构。 但我会用@ patrick的代码来实现这个结构。 非常感谢他们两位。

要告诉您想要的确切结果有点难。

这段代码:

  // Split values into arrays Code = Code.split('*'); Name = Name.split('*'); ids = ids.split('*'); // cache the length of one and create the result object var length = Code.length; var result = {}; // Iterate over each array item // If we come across a new code, // add it to result with an empty array for(var i = 0; i < length; i++) { if(Code[i] in result == false) { result[ Code[i] ] = []; } // Push a new object into the Code at "i" with the Name and ID at "i" result[ Code[i] ].push({ name:Name[i], id:ids[i] }); } 

会产生这种结构:

 // Resulting object { // A12 has array with one object A12: [ {id: "1", name: "John"} ], // B22 has array with two objects B22: [ {id: "2", name: "Brain"}, {id: "3", name: "Andy"} ] } 
  1. 将字符串拆分为“*”,以便有3个数组。
  2. 从每个数组的like-indexed元素构建对象。
  3. 在构建这些对象时,收集包含每个“代码”值的数组的第二个对象。

码:

 function toGroups(ids, names, codes) { ids = ids.split('*'); names = names.split('*'); codes = codes.split('*'); if (ids.length !== names.length || ids.length !== codes.length) throw "Invalid strings"; var objects = [], groupMap = {}; for (var i = 0; i < ids.length; ++i) { var o = { id: ids[i], name: names[i], code: code[i] }; objects.push(o); if (groupMap[o.code]) { groupMap[o.code].push(o); else groupMap[o.code] = [o]; } return { objects: objects, groupMap: groupMap }; } 

您想要的“两个数组”将位于该函数返回的对象的“groupMap”属性中。