亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

合并 2 個數組,同時忽略空字段

合并 2 個數組,同時忽略空字段

揚帆大魚 2022-09-02 16:10:40
我試圖將數組2合并到數組1中,以便空字段保持像數組1一樣,并且具有值的字段在數組1處從數組2被覆蓋。但只有空字段,如果它是空的,則應將其視為數字并覆蓋字段。請看這兩條評論,以便更好地理解我的意思。我嘗試過:const array1 = [[2], [], [3,5], [], [1]]const array2 = [[], [], [4], [], [null]]Array.prototype.splice.apply(array1, [0, array2.length].concat(array2))console.log(array2)// this logs [[], [], [4], [], [null]]// what is should log is [[2], [], [4,5], [], [null]]
查看完整描述

4 回答

?
慕桂英4014372

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]]


查看完整回答
反對 回復 2022-09-02
?
Qyouu

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]]


查看完整回答
反對 回復 2022-09-02
?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

您可以映射兩次:

array1.map((arr, i) => arr.map((v, j) => j in array2[i] ? array2[i][j] : v));


查看完整回答
反對 回復 2022-09-02
?
瀟瀟雨雨

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);


查看完整回答
反對 回復 2022-09-02
  • 4 回答
  • 0 關注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號