簡體   English   中英

如何使用 JavaScript 中的 ID 加入兩個關聯 arrays?

[英]How to join with two associative arrays using an ID in JavaScript?

我有兩個 arrays,我需要做的是將它們組合起來並給我結果數組。 但是我已經盡我所能但仍然無法做到,我正在嘗試使用此鏈接上的信息但它仍然沒有給我

https://stackoverflow.com/questions/42429023/how-can-i-perform-an-inner-join-with-two-object-arrays-in-javascript# =

const ap_procedures = [ 
{num_document: "39553466"}, 
{num_document: "39559282"}, 
{num_document: "39553466"}, 
];

const us_users = [ 
{num_document: "39553466", errors: "lorem ipsun #1"}, 
{num_document: "39559282", errors: "lorem ipsun #2"}, 
];

const result = [ 
{num_document: "39553466", errors: "lorem ipsun #1"}, 
{num_document: "39559282", errors: "lorem ipsun #2"}, 
{num_document: "39553466", errors: "lorem ipsun #1"}, 
];

最簡單的做法是使用reduceus_users數組中生成 object,然后是map數組中的ap_procedures

 const ap_procedures = [{num_document:"39553466"},{num_document:"39559282"},{num_document:"39553466"}]; const us_users = [{num_document:"39553466",errors:"lorem ipsun #1"},{num_document:"39559282",errors:"lorem ipsun #2"}]; const obj = us_users.reduce((a, { num_document, errors }) => ({...a, [num_document]: errors }), {}); const result = ap_procedures.map(({ num_document }) => ({ num_document, errors: obj[num_document] })); console.log(result);
 .as-console-wrapper { max-height: 100%;important: top; auto; }

直接的方法是遍歷ap_procedures並為每個項目在us_users中搜索匹配的項目:

let result = ap_procedures.map(item => {
    let key = item.num_document;

    return us_users.find(x => x.num_document === key);
});

這有效並且很容易理解。 如果你不熟悉map()find()上面的代碼基本上是這樣做的:

let result = [];

for (let i=0; i<ap_procedures.length; i++) {
    let item = ap_procedures[i];
    let key = item.num_document;

    for (let j=0; j<us_users.length; j++) {
        if (us_users[j].num_document === key) {
            result.push(us_users[j]);
        }
    }
}

然而,這具有O(n-ap_procedures) * O(n-us_users)的時間復雜度。 一種更快的技術是通過您要加入的密鑰構建us_users項目的地圖/字典,然后改用該 map。 這是假設us_users是唯一的:

// build the map
let map = {};
us_users.forEach(x => map[x.num_document] = x);

// use the map
let result = ap_procedures.map(item => {
    let key = item.num_document;

    return map[key];
});

這在O(n-ap_procedures) + O(n-us_users)中運行。

為什么不使用 hashmap?

const resultObj = {}

eachArray.reduce((accum, el) => ({...accum, [el.num_documento]: el}), resultObj)

然后你可以 map 超過 Object.keys(resultObj) 來制作一個新數組......

注意:這會覆蓋每個副本的最終 object。 您可以解構舊值,但您將覆蓋該 num_documento 的任何先前值。 你也可以解決這個問題......

暫無
暫無

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

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