代码之家  ›  专栏  ›  技术社区  ›  John Doe

循环遍历数组并分配新数组的键

  •  0
  • John Doe  · 技术社区  · 6 年前

    我正在尝试创建一个新数组,它的键是旧数组的索引

    var array = [
              {"tom": "red", "part":"green", "brow_id":45},
              {"tom": "red", "part":"yellow", "brow_id":1},
              {"tom": "red", "part":"yellow", "brow_id":2},
              {"tom": "maroon", "part":"cyan", "brow_id":45}
               ];
    var newarray = {};
    
    array.forEach(function(elem) {
            newarray[elem.brow_id] = elem;
                        });
    

    新形成的数组如下

             45: {"tom": "red", "part":"green", "brow_id":45},
             1:  {"tom": "red", "part":"yellow", "brow_id":1},
             2:  {"tom": "red", "part":"yellow", "brow_id":2},
    

    我希望它包含像这样的旧数组的所有id

            45: [{"tom": "red", "part":"green", "brow_id":45},{"tom": "maroon", "part":"yellow", "brow_id":45}]
             1:  {"tom": "red", "part":"yellow", "brow_id":1},
             2:  {"tom": "red", "part":"yellow", "brow_id":2},
    

    怎么了?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Nina Scholz    6 年前

    您可以检查属性是否给定并分配元素,否则检查数组,如果没有,则创建数组。稍后推动滤芯。

    var array = [{ tom: "red", part: "green", brow_id: 45 }, { tom: "red", part: "yellow", brow_id: 1 }, { tom: "red", part: "yellow", brow_id: 2 }, { tom: "maroon", part: "cyan", brow_id: 45 }],
        object = {};
    
    array.forEach(function(elem) {
          if (!object[elem.brow_id]) {
              object[elem.brow_id] = elem;
              return;
          }
          if (!Array.isArray(object[elem.brow_id])) {
              object[elem.brow_id] = [object[elem.brow_id]];
          }
          object[elem.brow_id].push(elem);
    });
    
    console.log(object);
    .as-console-wrapper { max-height: 100% !important; top: 0; }
        2
  •  1
  •   Ele    6 年前

    您可以使用该功能 reduce 分组并生成所需的输出。

    var array = [{    "tom": "red",    "part": "green",    "brow_id": 45  },  {    "tom": "red",    "part": "yellow",    "brow_id": 1  },  {    "tom": "red",    "part": "yellow",    "brow_id": 2  },  {    "tom": "maroon",    "part": "cyan",    "brow_id": 45  }];
    
    var result = array.reduce((a, elem) => {
      if (a[elem.brow_id]) {
        if (Array.isArray(a[elem.brow_id])) a[elem.brow_id].push(elem);
        else a[elem.brow_id] = [elem, a[elem.brow_id]];
      } else a[elem.brow_id] = elem; 
      
      return a;
    }, {});
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    使用您的方法 forEach 修复检查已向新对象添加的元素。

    var array = [{    "tom": "red",    "part": "green",    "brow_id": 45  },  {    "tom": "red",    "part": "yellow",    "brow_id": 1  },  {    "tom": "red",    "part": "yellow",    "brow_id": 2  },  {    "tom": "maroon",    "part": "cyan",    "brow_id": 45  }];
    
    var newarray = {};
    
    array.forEach(function(elem) {
      if (newarray[elem.brow_id]) {
        if (Array.isArray(newarray[elem.brow_id])) newarray[elem.brow_id].push(elem);
        else newarray[elem.brow_id] = [elem, newarray[elem.brow_id]];
      } else newarray[elem.brow_id] = elem;  
    });
    
    console.log(newarray);
    。作为控制台包装{最大高度:100%!重要;顶部:0;}
        3
  •  0
  •   Ori Drori    6 年前

    分组使用 Array.forEach() :

    var array = [{"tom":"red","part":"green","brow_id":45},{"tom":"red","part":"yellow","brow_id":1},{"tom":"red","part":"yellow","brow_id":2},{"tom":"maroon","part":"cyan","brow_id":45}];
    
    var result = {};
    
    array.forEach(function(o) {
      var key = o['brow_id'];
      
      result[key] = key in result ? [].concat(result[key], o) : o;
    });
    
    console.log(result);