[英]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.