Javascript 个数组:给定数组[n],得到数组[n*m]
Javascript arrays: Given array[n], get array[n*m]
我想知道哪种方法是使用 javascript 的原生数组方法(map、reduce 等)解决此问题的最佳方法。
给定一个包含 n 个对象的数组,我想创建另一个数组,该数组将为原始数组中的每个元素包含 m 个对象。我可以使用常见的 "for" 循环来迭代数组,但我想知道它是否可以用本机数组方法解决。
示例案例:
我有一个包含 n 个元素的数组 "ObjectA":
var objectA = {
name: "xxx",
tels: ["yyy","zzz"]
};
我想获得另一个类型为 "ObjectB" 的对象数组:
var objectB = {
name: "xxx",
tel: "yyy"
};
所以在这种情况下,如果第一个数组仅包含对象 A,则所需结果将是:
[
{
name: "xxx",
tel: "yyy"
},
{
name: "xxx",
tel: "zzz"
}
]
我试过使用两个嵌套的 "map" 调用,但回调函数只能 return 一个元素。
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 方式?
您已经接近嵌套地图了,但是正如您注意到的那样,您将在数组中获得数组。为避免使用 forEach 并将结果推送到内部循环中的数组:
var result = [];
initialArray.forEach(function(item){
item.tels.forEach(function(tel){
result.push({
name : item.name,
tel : tel
});
});
});
Array.prototype.map 无法在此处使用 array1
root,因为它 returns 是一个相同长度的数组,这不是您想要的。
如果你想要另一个长度,你可以使用 Array.prototype.reduce,然后对每个对象 tels 使用 Array.prototype.map。
var array2 = array1.reduce(function (prev, curr) {
return prev.concat(curr.tels.map(function (tel) {
return {name: curr.name, tel: tel};
}));
}, []);
我想知道哪种方法是使用 javascript 的原生数组方法(map、reduce 等)解决此问题的最佳方法。
给定一个包含 n 个对象的数组,我想创建另一个数组,该数组将为原始数组中的每个元素包含 m 个对象。我可以使用常见的 "for" 循环来迭代数组,但我想知道它是否可以用本机数组方法解决。
示例案例:
我有一个包含 n 个元素的数组 "ObjectA":
var objectA = {
name: "xxx",
tels: ["yyy","zzz"]
};
我想获得另一个类型为 "ObjectB" 的对象数组:
var objectB = {
name: "xxx",
tel: "yyy"
};
所以在这种情况下,如果第一个数组仅包含对象 A,则所需结果将是:
[
{
name: "xxx",
tel: "yyy"
},
{
name: "xxx",
tel: "zzz"
}
]
我试过使用两个嵌套的 "map" 调用,但回调函数只能 return 一个元素。
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 方式?
您已经接近嵌套地图了,但是正如您注意到的那样,您将在数组中获得数组。为避免使用 forEach 并将结果推送到内部循环中的数组:
var result = [];
initialArray.forEach(function(item){
item.tels.forEach(function(tel){
result.push({
name : item.name,
tel : tel
});
});
});
Array.prototype.map 无法在此处使用 array1
root,因为它 returns 是一个相同长度的数组,这不是您想要的。
如果你想要另一个长度,你可以使用 Array.prototype.reduce,然后对每个对象 tels 使用 Array.prototype.map。
var array2 = array1.reduce(function (prev, curr) {
return prev.concat(curr.tels.map(function (tel) {
return {name: curr.name, tel: tel};
}));
}, []);