我喜欢解释为什么这个功能的结果不符合我的期望。
const numbers = [ 1, 2 ]
const objects = [{f: 'a'}, {f: 'b'}]
async function(domain) {
let matrix = []
objects.forEach((object) => {
numbers.forEach((number) => {
object.number = number
matrix.push(object)
})
})
return matrix
}()
结果,一旦承诺得到解决,就会返回:
[
{ f: 'a', number: 2 },
{ f: 'a', number: 2 },
{ f: 'b', number: 2 },
{ f: 'b', number: 2 }
]
但是,我的期望是它会回归:
[
{ f: 'a', number: 1 },
{ f: 'a', number: 2 },
{ f: 'b', number: 1 },
{ f: 'b', number: 2 }
]
最令我困惑的事情之一是,如果我在推动之前console.log
对象的值,它会在我预期的结果中注销掉每个对象。
答案 0 :(得分:6)
因为对象是通过引用传递的,而您正在修改原始对象,所以您可以推送新对象。
const numbers = [ 1, 2 ]
const objects = [{f: 'a'}, {f: 'b'}]
let matrix = []
objects.forEach((object) => {
numbers.forEach((number) => {
matrix.push({...object, number})
})
})
console.log(matrix)

答案 1 :(得分:1)
使用嵌套Array#map来迭代objects
和number
以及Object#assign以创建包含该数字的新对象。使用spread syntax中的Array#concat展平生成的嵌套数组:
const numbers = [ 1, 2 ]
const objects = [{f: 'a'}, {f: 'b'}]
const matrix = [].concat(... // flatten the nested arrays
objects.map((o) => // map the objects
numbers.map( // map the numbers
(number ) => Object.assign({}, o, { number }) // return a new object with the number
)
));
console.log(matrix);

答案 2 :(得分:0)
@Nenad是正确的。您也可以使用缩小和地图。
const numbers = [ 1, 2 ];
const objects = [{f: 'a'}, {f: 'b'}];
const matrix = numbers.reduce((acc, nxt) => {
const numberedObjs = objects.map(obj => ({...obj, number:nxt}));
acc.push(...numberedObjs);
return acc;
}, []);