簡體   English   中英

使用lodash javascript來完全連接二維數組

[英]use lodash javascript to full join two-dimensional array

我有兩個二維數組。

var arr1=[[1,20],[2,30]];
var arr2=[[2,40],[3,50]];

這是預期的輸出:

[[1,20,null],[2,30,40],[3,null,50]]

這就像是兩個數據幀的完全連接。 邏輯類似於這個偽代碼:

df1.join(df2, df1[col_1] == df2[col_1], 'full')

但這種情況適用於二維數組。 lodash可以這樣做嗎? 如果沒有,如何在香草javascript中做到這一點?

好吧, lodash不能這樣做,但我們可以:

function flatten2d(arr1, arr2) {
  const o1 = _.fromPairs(arr1);
  const o2 = _.fromPairs(arr2);
  const result = [];

  _.forEach(o1, (v, k) => {
    const v2 = o2[k] || null;
    result.push([k|0, v, v2]);
    delete o2[k];
  });

  // at this point, only items non-existing
  // in o1 are left in o2
  _.forEach(o2, (v, k) => {
    result.push([k|0, null, v]);
  });

  return result;
}

測試:

flatten2d([[1,20],[2,30]], [[2,40],[3,50]])

結果:

[[1,20,null], [2,30,40], [3,null,50]]

如果你在任何單個數組中都沒有重復的id,那么你可以嘗試將它們組合起來,並使用groupBy將它們與第一個元素(即鍵0 )分組,如果你有重復項,無論如何我不確定你究竟是什么輸出尋找! 這是你可以做的:

    _(arr1.concat(arr2)).groupBy('0').map(v=>
        [v[0][0]].concat(v.length > 1 ? v.map(m=>m[1]) : [v[0][1], null])
    ).value();

這是一個適合您的工作片段:

 var arr1=[[1,20],[2,30]]; var arr2=[[2,40],[3,50]]; var res = _(arr1.concat(arr2)).groupBy('0').map(v=> [v[0][0]].concat(v.length > 1 ? v.map(m=>m[1]) : [v[0][1],null]) ).value(); console.log(JSON.stringify(res)); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script> 

暫無
暫無

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

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