遍历嵌套数组,按索引对对象进行分组

时间:2019-01-19 14:52:48

标签: javascript arrays loops sorting javascript-objects

我有这个嵌套数组。

var arr = [
    [{ a }, { b }, { c }, { d }],
    [{ a }, { b }],
    [{ a }, { b }, { c }],
    [{ a }]
];

我需要像这样

var arr = [
    [{ a }, { a }, { a }, { a }],
    [{ b }, { b }, { b }],
    [{ c }, { c }],
    [{ d }]
];

这是我到目前为止(不是很远)去的地方:

(function() {
  var arr = [
    [{ a:"a" }, { b:"b" }, { c:"c" }, { d:"d" }],
    [{ a:"a" }, { b:"b" }],
    [{ a:"a" }, { b:"b" }, { c:"c" }],
    [{ a:"a" }]
  ];

  for (i = 0, j = 0; i < arr.length; i++) {
    var childArray2 = arr[i];
    console.log("i: " + i + ", j: " + j);
  }
})();

我已经抽动了头脑,被困住了,非常感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我不确定您的结构100%,因为您显示的结构无效,因此我对其进行了一些修改。但是,这里有一种使用reduce()的方法,该方法使用以下假设:相等的对象位于嵌套数组的相同索引上

var arr = [
    [{a: "a"}, {b: "b"}, {c: "c"}, {d: "d"}],
    [{a: "a"}, {b: "b"}],
    [{a: "a"}, {b: "b"}, {c: "c"}],
    [{a: "a"}]
];

let res = arr.reduce((res, curr) =>
{
    curr.forEach((v, i) => res[i] = res[i] ? [...res[i], v] : [v]);
    return res;
}, []);

console.log(res);

下一个版本是仅使用for循环的替代版本:

var arr = [
    [{a: "a"}, {b: "b"}, {c: "c"}, {d: "d"}],
    [{a: "a"}, {b: "b"}],
    [{a: "a"}, {b: "b"}, {c: "c"}],
    [{a: "a"}]
];

var newArr  = [];

for (var i = 0; i < arr.length; i++)
{
    for (var j = 0; j < arr[i].length; j++)
    {
        if (!newArr[j])
        {
            newArr[j] = [];
            newArr[j].push(arr[i][j]);
        }
        else
        {
            newArr[j].push(arr[i][j]);
        }
    }
}

console.log(newArr);

答案 1 :(得分:-1)

怎么样?

let a,b,c,d;
var arr = [
 [{ a }, { b }, { c }, { d }],
 [{ a }, { b }],
 [{ a }, { b }, { c }],
 [{ a }]
];

let pivotArr = arr => arr[0].map((x,i) => arr.map(x => x[i]));
pivotArr(arr);