簡體   English   中英

合並兩個數組避免 O(n^2) 復雜度

[英]Merge two arrays avoiding O(n^2) complexity

給定兩個數組,農民和集合,當集合中的 farmer_id 等於農民中的 id 時,我希望能夠將農民信息合並到每個集合中。 如果集合中沒有與 farmer_id 匹配的農夫的 id,則該集合應該有一個空的農夫對象

const farmers = [{
        id: 10,
        name: 'John Doe',
        email: 'jdoe@gmail.com'
    },
    {
        id: 11,
        name: 'James Bond',
        email: 'james@gmail.com'
    }
]
const collections = [{
        id: 9,
        name: 'Book',
        farmer_id: 10,
        date: 'June'
    },
    {
        id: 10,
        name: 'Game',
        farmer_id: 11,
        date: 'July'
    },
    {
        id: 13,
        name: 'Car',
        farmer_id: 10,
        date: 'August'
    },
    {
        id: 11,
        name: 'Wristwatches',
        farmer_id: 20,
        date: 'August'
    }
]

結果應采用以下格式

const result = [{
        id: 9,
        name: 'Book',
        farmer_id: 10,
        date: 'June',
        farmer: {
            id: 10,
            name: 'John Doe',
            email: 'jdoe@gmail.com'
        }
    },
    {
        id: 10,
        name: 'Game',
        farmer_id: 11,
        date: 'July',
        farmer: {
            id: 11,
            name: 'James Bond',
            email: 'james@gmail.com'
        }
    },
    {
        id: 13,
        name: 'Car',
        farmer_id: 10,
        date: 'August',
        farmer: {
            id: 10,
            name: 'John Doe',
            email: 'jdoe@gmail.com'
        }
    },
    {
        id: 11,
        name: 'Wristwatches',
        farmer_id: 20,
        date: 'August',
        farmer: {}
    }
]

這是我能夠想出的,但現在被卡住了

function mapper(farmers, collectors) {
    for (let k = 0; k < farmers.length; k++) {
        const idToFarmerInfo = {};
        idToFarmerInfo[farmers[k].id] = farmers[k];
        for (let j = 0; j < collectors.length; j++) {
            let mapper = idToFarmerInfo[collectors[j].farmer_id];
            farmers[mapper] = collectors[j]
        }
    }
    return farmers
}

我跟着這個鏈接,因為我試圖避免 O of N 平方但 O of N 復雜性

為了獲得更好的性能,您可以創建一個complexityO(N)農民hash ,因為我們迭代farmers列表一次

 const farmers = [{ id: 10, name: 'John Doe', email: 'jdoe@gmail.com' }, { id: 11, name: 'James Bond', email: 'james@gmail.com' } ]; const collections = [{ id: 9, name: 'Book', farmer_id: 10, date: 'June' }, { id: 10, name: 'Game', farmer_id: 11, date: 'July' }, { id: 13, name: 'Car', farmer_id: 10, date: 'August' }, { id: 11, name: 'Wristwatches', farmer_id: 20, date: 'August' } ] var farmers_hash = farmers.reduce((hash, item) => { hash[item.id] = item; return hash; }, {}); console.log(farmers_hash);

下一步是通過使用哈希鍵分配一個農民來構建所需的output

這可以通過結合使用map方法和Object.assign實現

 const farmers = [{ id: 10, name: 'John Doe', email: 'jdoe@gmail.com' }, { id: 11, name: 'James Bond', email: 'james@gmail.com' } ]; const collections = [{ id: 9, name: 'Book', farmer_id: 10, date: 'June' }, { id: 10, name: 'Game', farmer_id: 11, date: 'July' }, { id: 13, name: 'Car', farmer_id: 10, date: 'August' }, { id: 11, name: 'Wristwatches', farmer_id: 20, date: 'August' } ] var farmers_hash = farmers.reduce((hash, item) => { hash[item.id] = item; return hash; }, {}); var result = collections.map((item) => { item.farmer = Object.assign({}, farmers_hash[item.farmer_id]) return item; }); console.log(result);

如您所見,最終復雜度為O(N) + O(M) ,其中Nfarmers數組的長度, Mcollections數組的長度。

stackblitz 上的演示

您可以使用更具聲明性的方法並使用Array.mapArray.find

const result = collections.map(collection => {
  return {
    ...collection,
    farmer: farmers.find(farmer => collection.farmer_id == farmer.id) || {}
  };
});

console.log(result);

您可以創建一個Map集合,以便通過id對所需的農民進行O(N)訪問。 然后映射在性能方面變得更快:

const unique = new Map(farmers.map(f=> [f.id, f]));

const result = collections.map(s => ({
    ...s, farmer_id: unique.get(s.farmer_id) || s.farmer_id
}))

現在collections映射具有復雜度O(N) 但是,不要忘記總結制作獨特農民的復雜性。 整體復雜度為O(N) + O(M)

一個例子:

 const farmers = [{ id: 10, name: 'John Doe', email: 'jdoe@gmail.com' }, { id: 11, name: 'James Bond', email: 'james@gmail.com' } ]; const collections = [{ id: 9, name: 'Book', farmer_id: 10, date: 'June' }, { id: 10, name: 'Game', farmer_id: 11, date: 'July' }, { id: 13, name: 'Car', farmer_id: 10, date: 'August' }, { id: 11, name: 'Wristwatches', farmer_id: 20, date: 'August' } ]; const unique = new Map(farmers.map(f=> [f.id, f])); const result = collections.map(s => ({ ...s, farmer_id: unique.get(s.farmer_id) || s.farmer_id })) console.log(result);

暫無
暫無

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

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