簡體   English   中英

使用 Ramda 將對象數組轉換為嵌套對象

[英]Transform array of objects to nested objects using Ramda

我是新手,如果我問一個幼稚的問題,請原諒我。

我有一個對象數組

const arr = [{id: 1, name: 'Pete'}, {id: 5, name: 'John'}, {id: 3, name: 'Peter'}]

我想使用 ramda 將其轉換為這種形式:

const obj = {1 : {id: 1, name: 'Pete'}, 5: {id: 5, name: 'John'}, 3: {id: 3, name: 'Peter'}} 

有人可以幫忙嗎?

其他概念性問題:

  1. 我想將嵌套的對象數組轉換為這種形式,因為如果給出了id那么搜索name會很快。 這是正確的方法嗎?
  2. 有沒有其他有效的性能方式可以使數組中的搜索更快?

謝謝

您可以使用 ramda 的 R.indexBy:

 const arr = [{id: 1, name: 'Pete'}, {id: 2, name: 'John'}, {id: 3, name: 'Peter'}] const result = R.indexBy(R.prop('id'))(arr) console.log(result)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>

我想將嵌套的對象數組轉換為這種形式,因為如果給出了 id,那么搜索名稱會很快。 這是正確的方法嗎?

從數組中獲取一個項目通常是 O(n)。 從對象(字典)中獲取項目,通過屬性索引為 O(1),因此對象獲勝...如果您想通過id獲取名稱。 但是,如果要按名稱查找對象,則應按name屬性進行索引。 此外,您要查找確切名稱嗎? 或包含某些內容的名稱。 如果搜索是名稱的一部分,那么您仍然需要迭代所有 O(n),數組也應該沒問題。

有沒有其他有效的性能方式可以使數組中的搜索更快?

這實際上取決於您將如何搜索,以及您將要搜索的項目數量,如果您的數量低於 50,000 並且搜索 hy id - 一個對象或地圖就可以了,通過名稱的一部分 - 一個數組就可以了。 但是,在您真正遇到問題之前不要嘗試優化,您對其進行了分析,並發現搜索是罪魁禍首。

如果沒有 ramda,您可以使用內置Object.fromEntriesid和 object 的映射。

 const array = [{ id: 1, name: 'Pete' }, { id: 2, name: 'John' }, { id: 3, name: 'Peter' }], object = Object.fromEntries(array.map(o => [o.id, o])); console.log(object[2].name); console.log(object);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

您可以在此處使用Map以獲得更好的性能。

const map = new Map();
const arr = [{id: 1, name: 'Pete'}, {id: 2, name: 'John'}, {id: 3, name: 'Peter'}]

for(const {id, name} of arr){
  map.set(id, name);
}

//check id exists 
map.has(1)  // true
//get person's name
map.get(1) //"Pete"

您可以嘗試使用過濾器 - 這會使原始數組保持不變並返回一個包含匹配項的新數組:

 const arr = [{id: 1, name: 'Pete'}, {id: 2, name: 'John'}, {id: 3, name: 'Peter'}] let filtered = arr.filter(a => a.id == 1); console.log(filtered);

暫無
暫無

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

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