如何按屬性過濾物件陣列?例如,在這個陣列中,如果兩個或多個物件具有相同的屬性,如name和lastname,我想洗掉它們中的任何一個,并在陣列中只留下唯一的一個。示例:
[ {name: "George", lastname: "GeorgeLast", age: 12},
{name: "George", lastname: "GeorgeLast", age: 13},
{name: "Bob", lastname: "GeorgeLast", age: 12}]
結果應該是
[ {name: "George", lastname: "GeorgeLast", age: 13},
{name: "Bob", lastname: "GeorgeLast", age: 12}]
或者
[ {name: "George", lastname: "GeorgeLast", age: 12},
{name: "Bob", lastname: "GeorgeLast", age: 12}]
uj5u.com熱心網友回復:
應用此答案中顯示的技術,即:
function onlyUnique(value, index, self) {
return self.indexOf(value) === index;
}
...但使用findIndex某些標準而不僅僅是indexOf.
let people = [
{ name: "George", lastname: "GeorgeLast", age: 12 },
{ name: "George", lastname: "GeorgeLast", age: 13 },
{ name: "Bob", lastname: "GeorgeLast", age: 12 }
]
let result = people.filter(
(person, index) => index === people.findIndex(
other => person.name === other.name
&& person.lastname === other.lastname
));
console.log(result);
至于它是保留 12 歲的喬治還是 13 歲的喬治,這是一個如何findIndex作業的問題,它恰好回傳第一個匹配元素。因此,在您的示例中,它將保留 12 歲的喬治。
uj5u.com熱心網友回復:
另一種解決方案。
在這里,您不需要遍歷串列 n*n/2 次(如果我計算正確的話)。
另一方面,這個看起來不那么簡潔并且使用更多的記憶體。
使用您喜歡的任何一個。
const arr = [
{name: "George", lastname: "GeorgeLast", age: 12},
{name: "George", lastname: "GeorgeLast", age: 13},
{name: "Bob", lastname: "GeorgeLast", age: 12}
];
const obj = {}
arr.forEach(v => {
if (!obj[v.name]) {
obj[v.name] = {}
}
if (!obj[v.name][v.lastname]) {
obj[v.name][v.lastname] = v;
}
})
const result = [];
Object.values(obj).forEach(nameObj =>
Object.values(nameObj).forEach(surnObj => result.push(surnObj))
);
console.log(result)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/403089.html
標籤:
