返回值对n嵌套数组

时间:2017-11-07 12:31:40

标签: javascript arrays

我有一个可以多次嵌套的数组。但是,总是两个具有两个条目的数组分别位于每个“嵌套”的末尾。我总是需要返回每个嵌套结束时两个数组中的两个条目。

以下是一个例子:

const arr = [
    [
        [1, 2], [3, 4]
    ], [
        [5, 6], [7, 8]
    ], [
        [
            [9, 10], [11, 12]
        ], [
            [14, 15], [16, 17]
        ]
    ]
];

以下是预期结果:

const return1 = [
    { a: 1, b: 2 },
    { a: 3, b: 4 }
];
const return2 = [
    { a: 5, b: 6 },
    { a: 7, b: 8 }
];
const return3 = [
    { a: 9, b: 10 },
    { a: 11, b: 12 }
];
const return4 = [
    { a: 13, b: 14 },
    { a: 15, b: 16 }
];

我在网上找到的所有内容都是如何将n嵌套数组减少为平面数组,如下所示:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

3 个答案:

答案 0 :(得分:1)

您可以在检查嵌套数组的同时使用迭代和递归方法进行映射。

var array = [[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[[9, 10], [11, 12]], [[14, 15], [16, 17]]]],
    result = array.reduce(function iter(r, a) {
        return r.concat(Array.isArray((a[0] || [])[0])
            ? a.reduce(iter, [])
            : [a.map(([a, b]) => ({ a, b }))]
        );
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

使用自定义递归函数:



var arr = [[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[[9, 10], [11, 12]], [[14, 15], [16, 17]]]],
result = [],
get_pairs = function(arr, r){
    arr.forEach(function(v){
        if (Array.isArray(v)) {
	    if (!Array.isArray(v[0])) {
	        var o = {a: v[0], b: v[1]};
	        (!r.length || r[r.length-1].length==2)? r.push([o]) : r[r.length-1].push(o);
	    } else {
	        get_pairs(v, r);
	    }			
        }
    });  
};

get_pairs(arr, result);
console.log(result);




答案 2 :(得分:0)

花了很多时间。但是,这是一个非常混乱的代码。

有一个递归函数可以检查给定数组是否采用[[number, number],[number, number]]形式。如果是这样,它会向变量returnArray添加一个对象,我们正在故意改变它。

如果它不在表单中,我们只检查数组中的项目。



const arrInput = [
  [[1, 2], [3, 4]], 
  [[5, 6], [7, 8]], 
  [
   [[9, 10], [11, 12]], 
   [[14, 15], [16, 17]],
  ],
];
function mapArrayToObj(arr, returnArray = []) {
  if (arr.length === 2 && typeof arr[0][0] === "number" && 
      typeof arr[0][1] === "number" && typeof arr[1][0] === "number" &&
      typeof arr[1][1] === "number") {
         returnArray.push([
            { a: arr[0][0], b: arr[0][1] }, 
            { a: arr[1][0], b: arr[1][1] }
         ]);
  } else {
         arr.forEach((item) => { mapArrayToObj(item, returnArray); });
  }
  return returnArray;
}
console.log(mapArrayToObj(arrInput));