将两个forEach转换为地图

时间:2018-12-17 15:22:55

标签: javascript arrays foreach

如何将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]

4 个答案:

答案 0 :(得分:1)

您可以使用array#maparray#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 ]