[英]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.