如何匹配数组的结构?



我有两个数组,它们总是包含相同数量的元素。

var array1 = [["John","Barry","Anne"],["Greg"],["Tom"],["Roy","Rye"]]
var array2 = ["Banana","Orange","Apple","Grape","Pineapple","Raspberry","Pear"]

我希望array2具有与array1相同的数组结构,因此它应该看起来像:

var newArray = [["Banana","Orange","Apple"],["Grape"],["Pineapple"],["Raspberry","Pear"]]

我尝试使用array1length首先创建正确的lengthnew array,然后循环array以创建正确的lengthnested arrays。然后使用for loop,将array2's element推到这个new array,但我很难弄清楚如何做到这一点。

var array = new Array(array1.length)
var arrayLength = array1.map(x => x.length)
for (var i = 0; i < array.length; i++) {
array[i] = new Array(arrayLength[i]);
}
for (var k = 0; k < array.length; k++) {
for (var j = 0; j < array[k].length; j++) {
array[0][k].push(array2[j])
}
}

谢谢你的帮助!

您可以使用.map().splice()来获得预期的结果。
如果array2不允许更改,我们需要它的副本->.slice()

const array1 = [["John", "Barry", "Anne"], ["Greg"], ["Tom"], ["Roy", "Rye"]];
const array2 = ["Banana", "Orange", "Apple", "Grape", "Pineapple", "Raspberry","Pear"];
// if array2 can be modified, then this is not necessary
// and you have to replace <clone> with <array2> in the block below
const clone = array2.slice(); 
const newArray = array1.map(inner => {
return clone.splice(0, inner.length);
});
console.log(newArray);


第一个问题的答案

你只需要.map()(两次)和一点数学运算。

const array1 = [
[1, 2, 3],
[4],
[5],
[6, 7]
];
const array2 = ["Banana", "Orange", "Apple", "Grape", "Pineapple", "Raspberry", "Pear"];
const newArray = array1.map(inner => {
return inner.map(n => {
return array2[n - 1];
})
});
console.log(newArray);

(可以写成一行代码,但为了更容易阅读,我使用了显式的return)

const array1 = [["John", "Barry", "Anne"], ["Greg"], ["Tom"], ["Roy", "Rye"]];
const array2 = ["Banana", "Orange", "Apple", "Grape", "Pineapple", "Raspberry","Pear"];
let indexTracker=0;
const newArr = array1.map(nameArr => nameArr.map(_ => array2[indexTracker++]));
console.log(newArr);

使用Array.map()Array.slice()来获得最终结果

const array1 = [[1, 2, 3], [4], [5], [6, 7]]
const array2 = ["Banana", "Orange", "Apple", "Grape", "Pineapple", "Raspberry", "Pear"]
let index = 0;
const finalArray = array1.map((itemList) => {
const list = array2.slice(index, index + itemList.length);
index += itemList.length;
return list;
});
console.log(finalArray);

最新更新