Javascript,过滤数组中的对象并返回所有唯一的对象



我有一个对象数组,其中包含对象属性:

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
}, [])

最新更新