簡體   English   中英

將兩個數組中的對象合並為一個

[英]Merge objects from two arrays in one

我有一個關於數組中合並對象的問題。 最大的問題是如何在合並這些數組后保存這個數組結構,因為如果我使用的話。 push()迭代后,這些數組我收到一個大數組。 看看我的數據:

[ 
 [ 
   { name: '1' },
   { name: '2' },
   { name: '3' },
 ],
 [
   { name: '4' },
   { name: '5' },
   { name: '6' },
  ] 
]

[ 
 [ 
   { correct: false },
   { correct: true },
   { correct: false },
 ],
 [ 
   { correct: true },
   { correct: false },
   { correct: false },
 ] 
]

而我的觀點是如何將這兩個數組合並到一個數組中

[ 
 [ 
   { name: '1', correct: false },
   { name: '2', correct: true },
   { name: '3', correct: false },
 ],
 [ 
   { name: '4', correct: true },
   { name: '5', correct: false },
   { name: '6', correct: false },
 ] 
]

我嘗試了循環,但我收到一個大數組,但我需要兩個數組

for(i in nameArray) {
   for(j in nameArray[i]){
       var mergeObj = Object.assign(nameArray,correctArray[j]) //I get undefned
       correctArray.push(nameArray[i][j])
   }
}

你很近,但你有對象數組的數組,所以你需要correctArray[i][j]

 const nameArray = [ [{ name: '1' },{ name: '2' },{ name: '3' }], [{ name: '4' },{ name: '5' },{ name: '6' }] ]; const correctArray = [ [{ correct: false },{ correct: true },{ correct: false }], [{ correct: true },{ correct: false },{ correct: false }] ]; nameArray.forEach((a, i) => a.forEach((o, j) => Object.assign(o, correctArray[i][j])) ); console.log(nameArray); 

在這里,我使用.forEach() ,這比在數組上使用for-in更好。 nameArray中的對象正在變異,這就是你的結果。 您可以使用.map()調用並在Object.assign的開頭添加一個空對象(如果您不想變異)。

 const nameArray = [ [{ name: '1' },{ name: '2' },{ name: '3' }], [{ name: '4' },{ name: '5' },{ name: '6' }] ]; const correctArray = [ [{ correct: false },{ correct: true },{ correct: false }], [{ correct: true },{ correct: false },{ correct: false }] ]; const result = nameArray.map((a, i) => a.map((o, j) => Object.assign({}, o, correctArray[i][j])) ); console.log(result); 

對於新的獨立數組,可以使用Array#reduce並在矩陣中構建新對象。

 var array1 = [[{ name: '1' }, { name: '2' }, { name: '3' }], [{ name: '4' }, { name: '5' }, { name: '6' }]], array2 = [[{ correct: false }, { correct: true }, { correct: false }], [{ correct: true }, { correct: false }, { correct: false }]], result = [array1, array2].reduce((r, a) => (a.forEach((b, i) => (r[i] = r[i] || [], b.forEach((c, j) => Object.assign(r[i][j] = r[i][j] || {}, c)))), r), []); console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

let arr1 = [[ { name: '1' }, { name: '2' }, { name: '3' }],[{ name: '4' }, { name: '5' }, { name: '6' }]]

let arr2 = [[{ correct: false },{ correct: true },{ correct: false }],[{ correct: true },{ correct: false },{ correct: false }]]

let arr3 = arr1.map((ele,ind)=>{
   return ele.map((e,i)=>Object.assign(e,arr2[ind][i]))
})

這是另一個版本,它有點誇張,並展示了如何在更復雜的數據集的情況下處理嵌套程度的示例。

 const nameArray = [ [ { name: '1' }, { name: '2' }, { name: '3' }, ], [ { name: '4' }, { name: '5' }, { name: '6' }, ] ]; const correctArray = [ [ { correct: false }, { correct: true }, { correct: false }, ], [ { correct: true }, { correct: false }, { correct: false }, ] ]; var resultArray = [] function each(arr, fn){ let len = arr.length, i = -1 while(++i < len){ fn(arr[i], i) } } function addToArray(target, source){ each(source, (elem, index) => { if(!target[index]){ let newElem = elem.length ? [] : {} target[index] = newElem } if(elem.length){ addToArray(target[index], elem) } else { let keys = Object.keys(elem) each(keys, key => { if(target[index][key]) console.warn(`Key ${key} already exists, overwriting`) target[index][key] = elem[key] }) } }) } addToArray(resultArray, nameArray) addToArray(resultArray, correctArray) console.log(JSON.stringify(resultArray, null, 2)) 

我認為解決問題的最佳方法是遞歸函數。 與此類似的東西:

 var a = [ [ { name: '1' }, { name: '2' }, { name: '3' }, ], [ { name: '4' }, { name: '5' }, { name: '6' }, ] ] var b = [ [ { correct: false }, { correct: true }, { correct: false }, ], [ { correct: true }, { correct: false }, { correct: false }, ] ] var c = [ [ { hello: "world" } ] ]; function mergeRecursive(x,y){ /** * Ignore functions */ if( x instanceof Function ) { x = undefined; } if( y instanceof Function ) { y = undefined; } /** * Ignore undefineds */ if( x == undefined ) { return y; } if( y == undefined ) { return x; } /** * Get the keys and remove duplicated */ var kx = Object.keys(x).filter( (k) => ! ( x[k] instanceof Function ) ); var ky = Object.keys(y).filter( (k) => ! ( y[k] instanceof Function ) ); var ks = kx.concat( ky.filter( (e) => kx.indexOf(e) == -1 ) ); /** * Define the type of the result */ var result; if (x instanceof Array && y instanceof Array ) { result = []; ks = ks.map( (k) => 1 * k ); // cast to number } else { result = {}; } /** * Create the merge object recursively */ ks.forEach( (k) => result[k] = mergeRecursive(x[k],y[k]) ); return result; } var example1 = mergeRecursive(a,b); console.log("example 1"); console.log(example1); var example2 = mergeRecursive(example1,c); console.log("example 2"); console.log(example2); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM