我有一个对象数组,其中包含对象属性:
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);
如果您试图在数组的每个对象中获取phone对象,那么下面的代码将为您完成此操作。
它获取电话对象并将其存储在中
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
函数,该函数只返回未在集合中的电话。我们用map
完成,只提取JSON所需的部分
EDIT使用reduce
函数,您只能在allPersons
阵列上使用一个函数
let uniques = new Set();
const phones = allPersons.reduce( (filtered, {phone}) => {
if (!uniques.has(phone.id)) {
filtered.push(phone);
uniques.add(phone.id);
}
return filtered
}, [])