4 回答

TA貢獻1871條經驗 獲得超13個贊
通過覆蓋合并
編寫泛型函數的好處是巨大的。我正在使用在另一篇文章中寫的,不需要修改來支持您當前的需求 -merge
// main.js
import { merge } from './util'
const array1 = [[2], [], [3,5], [], [1]]
const array2 = [[], [], [4], [], [null]]
const result =
merge(array1, array2)
console.log(JSON.stringify(result))
// [[2],[],[4,5],[],[null]]
merge很有幫助,因為它可以直觀地處理任何可以想象到的形狀的嵌套對象和數組(甚至是稀疏數組?。?-
// util.js
const isObject = x =>
Object(x) === x
const mut = (o = {}, [ k, v ]) =>
(o[k] = v, o)
const merge = (left = {}, right = {}) =>
Object
.entries(right)
.map
( ([ k, v ]) =>
isObject(v) && isObject(left[k])
? [ k, merge(left[k], v) ]
: [ k, v ]
)
.reduce(mut, left)
export { merge }
展開下面的代碼段,以在您自己的瀏覽器中驗證結果 -
// util.js
const isObject = x =>
Object (x) === x
const mut = (o = {}, [ k, v ]) =>
(o[k] = v, o)
const merge = (left = {}, right = {}) =>
Object
.entries(right)
.map
( ([ k, v ]) =>
isObject(v) && isObject(left[k])
? [ k, merge (left[k], v) ]
: [ k, v ]
)
.reduce(mut, left)
// export { merge }
// main.js
// impor { merge } from './util'
const array1 = [[2], [], [3,5], [], [1]]
const array2 = [[], [], [4], [], [null]]
const result =
merge(array1, array2)
console.log(JSON.stringify(result))
// [[2],[],[4,5],[],[null]]
不可變合并
在本例中,我們的函數將永久更改其中一個輸入數組。這是一個變體,它接受任意數量的對象/數組,并允許我們輕松創建新數組,而無需更改任何輸入mergearray1merge
const array1 = [[2], [], [3,5], [], [1]]
const array2 = [[], [], [4], [], [null]]
const result =
merge([], array1, array2)
console.log("result:", JSON.stringify(result)) // [[2],[],[4,5],[],[null]]
console.log("array1:", JSON.stringify(array1)) // [[2],[],[3,5],[],[1]]
console.log("array2:", JSON.stringify(array2)) // [[],[],[4],[],[null]]
以下是修改后的模塊可能的外觀 -util
// util.js
const isArray =
Array.isArray
const isObject = x =>
Object(x) === x
const merge2 = (l = null, r = null) => // <- private; not exported
isArray(l) && isArray(r)
? merge([], l, r)
: isObject(l) && isObject(r)
? merge({}, l, r)
: r
const merge = (init = {}, ...all) => // <- public interface
all.reduce(replace, init)
const replace = (r = {}, o = {}) =>
{ for (const [ k, v ] of Object.entries(o))
r[k] = merge2(r[k], v)
return r
}
export { merge }
這最初是為另一個問題寫的,但從未發表過。我很高興我有一個地方終于發布了它。享受!
展開下面的代碼段以驗證瀏覽器中的結果 -
//util.js
const isArray =
Array.isArray
const isObject = x =>
Object(x) === x
const merge2 = (l = null, r = null) =>
isArray(l) && isArray(r)
? merge([], l, r)
: isObject(l) && isObject(r)
? merge({}, l, r)
: r
const merge = (init = {}, ...all) =>
all.reduce(replace, init)
const replace = (r = {}, o = {}) =>
{ for (const [ k, v ] of Object.entries(o))
r[k] = merge2(r[k], v)
return r
}
// export { merge }
// main.js
// import { merge } from './util'
const array1 = [[2], [], [3,5], [], [1]]
const array2 = [[], [], [4], [], [null]]
const result =
merge([], array1, array2)
console.log("result:", JSON.stringify(result))
// [[2],[],[4,5],[],[null]]
console.log("array1:", JSON.stringify(array1))
// [[2],[],[3,5],[],[1]]
console.log("array2:", JSON.stringify(array2))
// [[],[],[4],[],[null]]

TA貢獻1786條經驗 獲得超11個贊
您需要一個函數來獲取兩個數組并合并它們:
merge_arrays([3,5], [4]);
//=> [4,5]
merge_arrays([3,5], []);
//=> [3,5]
merge_arrays([3,5], [,7]);
//=> [3,7]
merge_arrays([3,5], [,7,8]);
//=> [3,7,8]
下面是一個可能的實現:
const merge_arrays =
([xh, ...xt], [yh, ...yt], ret = []) =>
xh === undefined && yh === undefined ? ret
: yh === undefined ? merge_arrays(xt, yt, [...ret, xh])
: merge_arrays(xt, yt, [...ret, yh]);
有了這個,你可以 - 假設 array1 和 array2 具有相同的長度 - 映射并應用于當前元素和位于同一索引處的元素:array1merge_arraysarray2
const array1 = [[2], [], [3,5], [], [1]];
const array2 = [[], [], [4], [], [null]];
array1.map((arr, idx) => merge_arrays(arr, array2[idx]));
//=> [[2], [], [4,5], [], [null]]

TA貢獻1825條經驗 獲得超6個贊
您可以映射兩次:
array1.map((arr, i) => arr.map((v, j) => j in array2[i] ? array2[i][j] : v));

TA貢獻1833條經驗 獲得超4個贊
老式的,但你可以看到整個過程:)
編輯:添加了一行。
const array1 = [[2], [], [3,5], [], [1]];
const array2 = [[], [], [4], [], [null]];
/*
// verbose way
if (array1.length == array2.length) {
for (var i=0; i < array1.length; i++) {
if (array1[i].length > 0) {
array1[i] = array2[i];
}
}
}
*/
// concise way
newArr = array1.map((el, i) => el.length > 0 ? array2[i] : el);
console.log(newArr);
添加回答
舉報