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

时间:2010-06-19 11:41:14

标签: javascript jquery

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

  1. 将字符串拆分为“*”,以便有3个数组。
  2. 从每个数组的like-indexed元素构建对象。
  3. 构建这些对象时,收集第二个包含每个“Code”值数组的对象。
  4. 代码:

    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”属性中。

答案 1 :(得分:1)

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

此代码:

       // 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"}
         ]
}