[英]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'}}
有人可以幫忙嗎?
其他概念性問題:
id
那么搜索name
會很快。 這是正確的方法嗎?謝謝
您可以使用 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.fromEntries
和id
和 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.