簡體   English   中英

Javascript組合兩個對象數組

[英]Javascript combine two array of objects

我想根據名稱組合 2 個數組的元素。 例如:

Array1 = [
  {name: "name1", language: "lang1"}, 
  {name: "name2", language: "lang2"}, 
  {name: "name3", language: "lang3"}]

Array2 = [
  {name: "name1", subject: "sub1"}, 
  {name: "name2", subject: "sub2"}, 
  {name: "name3", subject: "sub3"}]

我需要生成以下數組:

Array3 = [
  {language: "lang1", subject: "sub1"}, 
  {language: "lang2", subject: "sub2"}, 
  {language: "lang3", subject: "sub3"}]

我能想到的邏輯是編寫一個顯式的 for 循環,將第一個數組的每個元素與第二個數組的每個元素進行比較,並檢查名稱是否匹配,如下所示。

let Array3 = []
for(let i=0;i<Array1.length;i++)
{
    let elem = Array1[i];
    for(let j=0;j<Array2.length;j++)
    {
        if(Array2[j].name===elem.name)
        {
            Array3.append({language: elem.language, subject: Array2[j].subject})
            break;
        }
    }
}

但是,我的實際數據集非常大,這似乎效率低下。 如何以更有效的方式實現這一點(例如使用高階函數或其他東西)?

您需要遍歷兩個數組並將生成的對象分組到一個以名稱為key的映射中:

 let Array1 = [ {name: "name1", language: "lang1"}, {name: "name2", language: "lang2"}, {name: "name3", language: "lang3"} ]; let Array2 = [ {name: "name1", subject: "sub1"}, {name: "name2", subject: "sub2"}, {name: "name3", subject: "sub3"} ]; let map = new Map(); Array1.forEach(e => map.set(e.name, {language: e.language})); Array2.forEach(e => { if(map.has(e.name)) map.set(e.name, {...map.get(e.name), subject: e.subject}); }); let Array3 = [...map.values()].filter(e => e.language && e.subject); console.log(Array3);

使用 Map for O(1) 查找使用名稱作為鍵的數組之一可以讓您只迭代每個數組一次。

 const Array1=[{name:"name1",language:"lang1"},{name:"name2",language:"lang2"},{name:"name3",language:"lang3"}],Array2=[{name:"name1",subject:"sub1"},{name:"name2",subject:"sub2"},{name:"name3",subject:"sub3"}]; const a1Map = new Map(Array1.map(({name, ...r})=> [name, {...r}])); const res = Array2.map(({name, ...r}) => ({...r, ...a1Map.get(name)})) console.log(res)

是的,您按正確的順序思考,您需要使用排序算法邏輯,我會說嵌套 for 循環也一樣好。 對於較大的 dataset ,由於您需要從兩個不同的數組中提取值,因此可以使用嵌套的 for 循環。

 for(int i=0;i>array1.length();i++){
  This can be use for first array
  Define String x=",";
  For second
  for(int j=0;j>array2.length();j++)
  {
    Check if ( (","+j+",").contains(x)) then break;
    If array1 name found in array 2, store array3 as you want 
    Also Store value of j in x
    Like x=x +j+",";
   }}

這樣您的嵌套 for 循環將跳過比較代碼。 以上算法是原始的,但會顯着降低復雜性。

暫無
暫無

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

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