簡體   English   中英

Javascript,過濾對象數組並返回所有唯一對象

[英]Javascript, filtering array of objects and return all the unique objects

我有一個對象數組,其中包含對象屬性:

let allPersons = [
    { id: "abcdefg",
      name: "tom",
      ...
      phone: {
         brand: "blah"
         id: "hijklm"
         ...
     }
   },
   { id: ....}, {...}, {...}
];

我需要做的是過濾這些對象並返回所有電話,按 id 過濾它們,以便返回的所有電話都是唯一的。

我試圖首先檢索所有電話:

// allPersons is the full array mentioned above
let phones = [...new Set(allPersons.map(person => person.phone))];

然后我試圖退回所有獨特的手機,但沒有成功:

let result = phones.map(phone => phone.id).filter((value, index, self) => self.indexOf(value) === index)

這僅返回電話的唯一 ID,但我想要整個對象。 我能做什么?

更新:電話 ID 不是唯一的,例如 nokia3310 的 ID 為 1,nokia3330 的 ID 為 2,等等:所以 tom 和 john 可以擁有相同的電話,並且電話 ID 可以重復!

創建一個由 ID 索引的對象,然后獲取對象的值:

const phonesById = Object.fromEntries(
  allPersons.map(
    ({ phone }) => [phone.id, phone]
  )
);
const uniquePhones = Object.values(phonesById);

如果您嘗試在數組的每個對象中獲取電話對象,那么下面的代碼將為您完成。

它獲取電話對象並將其存儲在一個

var objArr = [
    {id: "abcdefg", name: "tom", phone: {brand: "blah", id: "hijklm"}},
    {id: "guidiuqwbd", name: "john", phone: {brand: "hihihih", id: "ayfva"}},
    {id: "yuygeve", name: "doe", phone: {brand: "hahahah", id: "cqcqw"}}
]

var allPhoneObjects = [];
objArr.forEach(function(currObj){
    var phoneObj = currObj.phone;
    allPhoneObjects.push(phoneObj);
});
console.log(allPhoneObjects);

我建議你以下解決方案

let uniques = new Set();
const phones = allPersons.filter(({phone}) => (
  uniques.has(phone.id) ? false : !!uniques.add(phone.id)
)).map(p => p.phone)

基本上,我們定義了一個Set來記錄已經處理過的電話的ids ,並在allPersons數組上定義了一個filter函數, allPersons返回不在 Set 中的電話。 我們完成map以僅提取所需的 JSON 部分

編輯您可以使用上只有一個功能allPersons使用陣列reduce功能

let uniques = new Set();
const phones = allPersons.reduce( (filtered, {phone}) => {
  if (!uniques.has(phone.id)) {
     filtered.push(phone);
     uniques.add(phone.id);
  }
  return filtered
}, [])

暫無
暫無

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

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