map循环嵌套,总是取得外层数组的最后一个值

有两组数组arr01和arr02
现在下把arr01数组中的某个字段添加到arr02中,现在问题 是最后得到的新数组总是arr01的最后一个字段

let arr01 = [
    {
        "account" : "000000000000"
    },
    {
        "account" : "111111111111"
    },
    {
        "account" : "2222222222222"
    }
];
let arr02 = [
    {
        "city" : "北京"
    },
    {
        "city" : "上海"
    },
    {
        "city" : "广东"
    }
];
                
let newArr = [];
arr01.map((cur01,eq) => {
    arr01.map((cur02,index) => {
        cur02.account = cur01.account;
        return newArr.push(cur);
    })
})

最后结果:

newArr = [
    {
        "account" : "2222222222222",
         "city" : "北京"
    },
    {
        "account" : "2222222222222",
        "city" : "上海"
    },
    {
        "account" : "2222222222222",
        "city" : "广东"
    },
    {
        "account" : "2222222222222",
         "city" : "北京"
    },
    {
        "account" : "2222222222222",
        "city" : "上海"
    },
    {
        "account" : "2222222222222",
        "city" : "广东"
    },
    {
        "account" : "2222222222222",
         "city" : "北京"
    },
    {
        "account" : "2222222222222",
        "city" : "上海"
    },
    {
        "account" : "2222222222222",
        "city" : "广东"
    }
];

我想得到的结果是:

newArr = [
    {
        "account" : "000000000000",
         "city" : "北京"
    },
    {
        "account" : "000000000000",
        "city" : "上海"
    },
    {
        "account" : "000000000000",
        "city" : "广东"
    },
    {
        "account" : "111111111111",
         "city" : "北京"
    },
    {
        "account" : "111111111111",
        "city" : "上海"
    },
    {
        "account" : "111111111111",
        "city" : "广东"
    },
    {
        "account" : "2222222222222",
         "city" : "北京"
    },
    {
        "account" : "2222222222222",
        "city" : "上海"
    },
    {
        "account" : "2222222222222",
        "city" : "广东"
    }
];
阅读 15.9k
5 个回答

你改变的是对象的引用地址 所有最后改变的影响前面push进去的了

var newArr = [];
arr01.forEach(v1 => {
    arr02.forEach(v2 => {
        newArr.push(Object.assign({}, v2, {
            account: v1.account
        }))
    })
})
console.log(newArr)

哥们,问问题要把代码排版好,不然看着很乱,都没有心情回答问题。我已经给你排好了。


看你的问题,应该是要把两个数组按序号对应合并成一个数组。而你的方法是有问题的,因为每次都是把 arr01 循环到最后一个元素,然后再把 arr02 里的数据改掉。

map 函数是返回一个新数组的,所以不用嵌套 map,直接循环一下重新组合数组就行。

参考下这个吧:

var arr = [];
arr01.forEach(function(value, index) {
    // 如果 arr02 里没有对应序号的 city,就填空字符串,这个你可以根据需要自己改
    value.city = arr02[index] || '';
    arr.push(value)
})
console.log(arr)

或者:

var arr = [];
arr02.forEach(function(value, index) {
    // 如果 arr01 里没有对应序号的 acdount,就填空字符串,这个你可以根据需要自己改
    value.account = arr01[index] || '';
    arr.push(value)
})
console.log(arr)

看你修改了问题,是要每个都对应修改,那就嵌套循环两次,不需要使用 map,直接用 forEach

var arr = [];
arr01.forEach(function(v, i) {
    arr02.forEach(function(vv, ii) {
        arr.push({
            account: v.account,
            city: vv.city
        })
    })
})
console.log(arr)

map的返回值是一个数组,这个问题用forEach比较合适

let newArr = [];
arr01.forEach(a1 => {
    arr02.forEach(a2 => {
        newArr.push({
            account: a1.account,
            city: a2.city
        });
    });
});

首先,你的思路是没有问题的,但是你使用

cur02.account = cur01.account;
return newArr.push(cur02);

上面的代码你push的是cur02js的对象赋值都是传的引用,所以循环结束后的结果是:

// [arr02[0], arr02[1], arr02[2], arr02[0], arr02[1], arr02[2], arr02[0], arr02[1], arr02[2]]

在你最后一次循环的时候arr02里面每个对象的account值都变为了"2222222222222"

所以,在push的时候你push一个新的对象进去,而不是已有对象的引用就可以解决问题了。另外,map改成forEach(mapforEach的使用场景不一样)。

let newArr = [];
arr01.forEach(cur01 => {
    arr02.forEach(cur02 => {
        newArr.push({
            account: cur01.account,
            city: cur02.city
        });
    })
})
var arr = [];
arr01.forEach(function(value, index) {
    value = {...value, ...arr02[index]};
    arr.push(value)
})
console.log(arr)

如果是一一对应的话,可以这样来写~

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题