如何将forEach的这两个循环转换为map函数?
var storedNames = [1,2,3];
var mod = {id: 3, blocList: [{id:11}, {id:12}]};
storedNames.forEach((item: number) => {
if (item === mod.id) {
mod.blocList.forEach((bloc: Bloc) => {
storedNames.push(bloc.id);
});
}
});
结果将是:storedNames = [1, 2, 3, 11, 12]
答案 0 :(得分:1)
您可以使用array#map
和array#concat
生成所需的数组。
var storedNames = [1,2,3],
mod = {id: 3, blocList: [{id:11}, {id:12}]},
result = [...storedNames].concat(mod.blocList.map(({id}) => id));
console.log(result);
答案 1 :(得分:1)
您可以将map
与传播语法结合使用,如下所示:
var storedNames = [1,2,3];
var mod = {id: 3, blocList: [{id:11}, {id:12}]};
if (storedNames.some(item => item == mod.id)) {
storedNames.push(...mod.blocList.map(bloc => bloc.id));
}
console.log(storedNames);
答案 2 :(得分:1)
这将起作用,但不是Array.map()
的完美使用。理想情况下,如果您想保持storedNames完整并使用循环所做的更改创建其副本,则可以使用map。如:
modifiedStoredNames = storedNames.map(//do stuff);
据我所知,map是一种使用作为参数传递的函数复制数组并复制每个元素的方法。在这种情况下,我们只是使用map()
进行循环(准确地说是两个循环),并根据该循环内的条件更新数组storedNames
。 并忽略真正返回的地图。
storedNames.map((item: number) => {
if (item === mod.id) {
mod.blocList.map((bloc: any) => {
storedNames.push(bloc.id);
})
}
})
答案 3 :(得分:0)
您也可以尝试以下代码。在这里,我只是尝试获取所需的输出。
如果您有更多具有不同格式的数据,则在这种情况下,您将需要根据目标结果来修改代码。
注意:在这里,您使用的是Typescript,我的回答是使用纯JavaScript(Node.js),所以请不要忘记在 parameter-list 中指定变量的类型或初始化语句,例如
function(item){...}
至function(item: number){...}
等
var storedNames = [1,2,3];
var mod = {id: 3, blocList: [{id:11}, {id:12}]};
var storedNames = storedNames.map(function(item) {
if(item === mod.id) {
var bArr = [item]; // [3]
var cArr = mod.blocList.map((bloc) => {
return(bloc.id); // Returning 11 and 12 one after one
});
bArr = bArr.concat(cArr);
// console.log(cArr); /* [ 11, 12 ] */
// console.log(bArr); /* [ 3, 11, 12 ] */
return bArr;
}
return item; // Returning 1 and 2 one after one
})
console.log(storedNames); // [ 1, 2, [ 3, 11, 12 ] ]
//Finally
storedNames = storedNames.concat(storedNames.splice(storedNames.length - 1, 1)[0]);
console.log(storedNames); // [ 1, 2, 3, 11, 12 ]