代码之家  ›  专栏  ›  技术社区  ›  IsmailS

将javascript项按一个属性分组

  •  1
  • IsmailS  · 技术社区  · 14 年前

    我的问题与 this 问题。你得先看一下。

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

    现在我有了一个javascript对象数组。我想根据 CODE . 所以这个代码字符串中可能有重复的代码。

    根据上面更改的字符串,我对Brain和Andy有相同的代码。所以,现在我想要两个数组。其中一个对象只包含约翰的详细信息,另一个对象包含两个对象,分别包含Brain和Andy的详细信息。

    举个例子,我拿了3个项目。实际上,可以有许多,也可以有许多不同的代码集。

    更新
    我需要像@pointy内置的groupmap对象那样的结构。但我将使用@patrick的代码来实现这个结构。多亏了他们两个。

    2 回复  |  直到 14 年前
        1
  •  1
  •   user113716    14 年前

    要知道您想要的确切结果结构有点困难。

    此代码:

           // 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"}
             ]
    }
    
        2
  •  1
  •   Pointy    14 年前
    1. 将字符串拆分为“*”,这样您就有了3个数组。
    2. 从每个数组的类似索引元素构建对象。
    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”属性中。