簡體   English   中英

如何訪問存儲在由一個字段鏈接的數組對象中的兩個數據?

[英]How to access two data stored in array object that are linked by one field?

我有一個 REST API,我從中獲取 json 數據並將它們存儲在數組中。 API 如下所示:

[


    {
        "id": "100",
        "name": "Person1",
        "number": "+91-8980439023"
      },
      {
        "id": "102",
        "name": "Person2",
        "number": "+91-5980339023"
      },
      {
        "id": "105",
        "name": "Person3",
        "number": "+91-8980439023"
      },
      {
        "id": "101",
        "name": "Person4",
        "number": "+91-8980439023",
        "parent": "105"
      },
      {
        "id": "110",
        "name": "Person5",
        "number": "+91-8980439023"
      },
      {
        "id": "115",
        "name": "Person6",
        "number": "+91-9834295899",
        "parent": "100"
      }
    ]

一些數據有“parent”字段。“parent”字段中的值是其他數據的“id”。 現在我想將這些在其他數據的“父”字段中有引用的數據存儲在一個單獨的數組中。 例如:id=101 的數據具有值為 105 的“parent”鍵,這又是第三個數據的 id。因此 id=105 的數據應存儲在單獨的數組中。

我怎樣才能以簡單且可擴展的方式進行操作?

嘗試

let parents = data.filter(d=> data.some(c=> c.parent==d.id));

 let data = [ { "id": "100", "name": "Person1", "number": "+91-8980439023" }, { "id": "102", "name": "Person2", "number": "+91-5980339023" }, { "id": "105", "name": "Person3", "number": "+91-8980439023" }, { "id": "101", "name": "Person4", "number": "+91-8980439023", "parent": "105" }, { "id": "110", "name": "Person5", "number": "+91-8980439023" }, { "id": "115", "name": "Person6", "number": "+91-9834295899", "parent": "100" } ]; let parents = data.filter(d=> data.some(c=> c.parent==d.id)); console.log(parents);

要具有 O(2n) 復雜性,首先將父母 id 放入某個哈希表,然后進行過濾

 let data = [ { "id": "100", "name": "Person1", "number": "+91-8980439023" }, { "id": "102", "name": "Person2", "number": "+91-5980339023" }, { "id": "105", "name": "Person3", "number": "+91-8980439023" }, { "id": "101", "name": "Person4", "number": "+91-8980439023", "parent": "105" }, { "id": "110", "name": "Person5", "number": "+91-8980439023" }, { "id": "115", "name": "Person6", "number": "+91-9834295899", "parent": "100" } ]; let hash = {}; data.forEach(d=> hash[d.parent]=d); let parents = data.filter(d=> d.id in hash); console.log(parents);

您可以使用map方法並將元素存儲到Map集合中,以便在映射項目時具有O(1)

const maps = new Map(fooArray.map(o=> [o.id, o]))
const result = fooArray.map(({parent, ...rest}) => {
    let obj = {...rest};
    parent ?  (obj.parent = [maps.get(parent)]) : null;
    return obj;
})
console.log(result);

一個例子:

 const fooArray = [ { "id": "100", "name": "Person1", "number": "+91-8980439023" }, { "id": "102", "name": "Person2", "number": "+91-5980339023" }, { "id": "105", "name": "Person3", "number": "+91-8980439023" }, { "id": "101", "name": "Person4", "number": "+91-8980439023", "parent": "105" }, { "id": "110", "name": "Person5", "number": "+91-8980439023" }, { "id": "115", "name": "Person6", "number": "+91-9834295899", "parent": "100" } ] const maps = new Map(fooArray.map(o=> [o.id, o])) const result = fooArray.map(({parent, ...rest}) => { let obj = {...rest}; parent? (obj.parent = [maps.get(parent)]): null; return obj; }) console.log(result);

為了簡化它的時間復雜度,我只將children數組轉換為以父id為鍵的對象。 這使您可以在O(1)中找到一個元素。

 const parents = [ { "id": "100", "name": "Person1" }, { "id": "102", "name": "Person2" } ] const children = [ { "parent": "102" } ] // Transform parents into an Object with ID's as keys for fast lookup. const obj = children.reduce((acc, item) => Object.assign({}, acc, { [item.parent]: true }), {}) // Filter over children. If aa child id exists as a key in `obj`, // include it in the result. const filtered = parents.filter(item => obj[item.id]) console.log(filtered) 

您還可以收集所有parent ids ,然后查找與某些parent id相同的記錄:

let par_ids = [];

records.forEach(pid =>{
  for (let [key, value] of Object.entries(pid)) {
    key == 'parent' ? par_ids.push(value) : null;
  }
})

let res = records.filter(ob => par_ids.includes(ob.id))

 let records = [ { "id": "100", "name": "Person1", "number": "+91-8980439023" }, { "id": "102", "name": "Person2", "number": "+91-5980339023" }, { "id": "105", "name": "Person3", "number": "+91-8980439023" }, { "id": "101", "name": "Person4", "number": "+91-8980439023", "parent": "105" }, { "id": "110", "name": "Person5", "number": "+91-8980439023" }, { "id": "115", "name": "Person6", "number": "+91-9834295899", "parent": "100" } ]; let par_ids = []; records.forEach(pid =>{ for (let [key, value] of Object.entries(pid)) { key == 'parent'? par_ids.push(value): null; } }) let res = records.filter(ob => par_ids.includes(ob.id)) console.log(res)

暫無
暫無

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

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