如何通过对象的键获取唯一的对象数组过滤结果?

4
我有一个对象数组。对象包含有关城市及其几何信息的信息。这是我的数组。
> [ {country: "AM", name: "Abovyan", lat: 40.27368, lng: 44.63348},
> {country: "AM", name: "Abovyan", lat: 40.04851, lng: 44.54742},
> {country: "AM", name: "Kapan", lat: 39.20755, lng: 46.4057} ]

正如您所看到的,我有两个对象具有相同的名称(例如Abovyan),但它们的几何信息不同。这个数组是我从某个API中获取的,我想要过滤它。如何过滤它只保留特定键/值的一个对象,即在此案例中是 名称

我希望获得像这样的过滤后的数组:

[ {country: "AM", name: "Abovyan", lat: 40.27368, lng: 44.63348},
  {country: "AM", name: "Kapan", lat: 39.20755, lng: 46.4057} ]

1
你想为名称Abovyan保留哪个值? - NullPointer
遍历数组,创建一个空对象,将键设置为名称,值设置为该对象,它将保留最后一个几何信息对象。 - Atul
我不想使用对象。 - Norayr Ghukasyan
@NorayrGhukasyan 如果您不想使用对象,那没关系,但是您应该在问题描述中提到这一点,否则您将得到的所有答案都将通过对象解决。我假设您已经有了一个使用对象的解决方案,并且正在寻找可能的无对象解决方案。 - Atul
为什么你不想使用对象呢? - Creynders
6个回答

8

使用.name属性作为对象键,从非重复项构建对象。完成后,从该对象中取出值数组。

var data = [ your data ];

var out = Object.values(
  data.reduce( (c, e) => {
    if (!c[e.name]) c[e.name] = e;
    return c;
  }, {})
);

4
您可以过滤掉那些在关键字中不存在的元素:
 const unique = (arr, key) => {
   const keys = new Set();
   return arr.filter(el => !keys.has(el[key]) && keys.add(el[key]));
 };

所以在您的情况下,您可以使用它作为 unique([/*...*/,"name")

4
您可以使用Array.reduce()来输出结果:

var arr = [ {country: "AM", name: "Abovyan", lat: 40.27368, lng: 44.63348},{country: "AM", name: "Abovyan", lat: 40.04851, lng: 44.54742},
{country: "AM", name: "Kapan", lat: 39.20755, lng: 46.4057} ];
var res = arr.reduce((acc, obj)=>{
   var exist = acc.find(({country, name}) => obj.country === country && obj.name === name);
   if(!exist){
    acc.push(obj);
   }
   return acc;
},[]);
console.log(res);


3
let materials = [
  {id: 1, name: "GALLERY PRINTS"},
  {id: 2, name: "GALLERY PRINTS"},
  {id: 3, name: "GALLERY PRINTS"},
  {id: 4, name: "FINE ART PRINTS"},
  {id: 5, name: "FINE ART PRINTS"}
]

let _materials = materials.filter((item, index, objects) => {
            if (index === 0) {
                return item;
            } else if (item.name !== objects[index - 1].name) {
                return item;
            }

        });

console.log(_materials);

1
虽然这段代码片段可能是解决方案,但包括解释真的有助于提高您的帖子质量。请记住,您正在回答未来读者的问题,而这些人可能不知道您的代码建议的原因。 - nircraft

2
以下代码执行了一个基本的过滤器,类似于使用 for..loop 循环并返回 true 或 false 以删除或保留项目。
我们可以使用 map 方法创建一个临时数组,然后使用 indexOf 方法来查找我们是否能够在 map 中找到相同的对象。如果找到,则说明它是重复的。

var records = [ {country: "AM", name: "Abovyan", lat: 40.27368, lng: 44.63348},{country: "AM", name: "Abovyan", lat: 40.04851, lng: 44.54742},{country: "AM", name: "Kapan", lat: 39.20755, lng: 46.4057} ];
function removeDuplicates(myArr, prop) {
    return myArr.filter((obj, pos, arr) => {
        return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos;
    });
}


console.log(removeDuplicates(records,"name"));


0

希望这可以帮到你

let person = [
  { group: 'A', name: 'Hello 1', age: 5 },
  { group: 'A', name: 'Hello 2', age: 6 },
  { group: 'B', name: 'Hello 3', age: 7 },
  { group: 'C', name: 'Hello 4', age: 5 },
  { group: 'B', name: 'Hello 5', age: 5 },
]
let uqiue_group = person.map(e => {
  return { group: e.group, name: e.name }
}).filter((element, index, array) => {
  return array.findIndex(a => a.group == element.group) === index
})

console.log(uqiue_group)
// output
// [
//   { group: 'A', name: 'Hello 1' },
//   { group: 'B', name: 'Hello 3' },
//   { group: 'C', name: 'Hello 4' }
// ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接