我想知道使用javascripts本机数组方法(map,reduce等)来解决这个问题的最佳方法。
给定n个对象的数组,我想创建另一个数组,该数组将包含原始数组中每个元素的m个对象。我可以使用常见的“for”循环来迭代数组,但我想知道它是否可以用原生数组方法解决。
示例案例:
我有一个数组,其中n个元素类似于“ObjectA”:
var objectA = {
name: "xxx",
tels: ["yyy","zzz"]
};
我想得到另一个“ObjectB”类型的对象数组:
var objectB = {
name: "xxx",
tel: "yyy"
};
所以在这种情况下,如果第一个数组只包含objectA,那么所需的结果将是:
[
{
name: "xxx",
tel: "yyy"
},
{
name: "xxx",
tel: "zzz"
}
]
我尝试过使用两个嵌套的“map”调用,但回调函数只能返回一个元素。
var array1 = [objectA];
var array2 = array1.map(function(objectA){
return objectA.tels.map(function(tel){
return {
name : objectA.name,
tel : tel
};
});
});
在回调中返回另一个数组,生成一个数组数组,这不是我想要的。 Array2结果:
[
[
{
name: "xxx",
tel: "yyy"
},
{
name: "xxx",
tel: "zzz"
}
]
]
我是否必须使用常见的for循环或是否有原生的javascript方式?
答案 0 :(得分:1)
Array.prototype.map无法在此处使用array1
root,因为它会返回一个长度相同的数组,这不是您想要的。
如果您想要其他长度,可以使用Array.prototype.reduce,然后对每个对象使用Array.prototype.map。
var array2 = array1.reduce(function (prev, curr) {
return prev.concat(curr.tels.map(function (tel) {
return {name: curr.name, tel: tel};
}));
}, []);
答案 1 :(得分:0)
您与嵌套地图很接近,但是当您注意到这样做时,您将获得数组中的数组。为了避免使用forEach并将结果推送到内循环中的数组:
var result = [];
initialArray.forEach(function(item){
item.tels.forEach(function(tel){
result.push({
name : item.name,
tel : tel
});
});
});