Javascript 如何获得通过对象键过滤的对象的唯一数组?

Javascript 如何获得通过对象键过滤的对象的唯一数组?,javascript,arrays,Javascript,Arrays,我有一个对象数组。对象包含有关城市及其几何信息的信息。这是我的数组 > [ {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} ] 如你所见,我有两

我有一个对象数组。对象包含有关城市及其几何信息的信息。这是我的数组

> [ {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} ]

这里,我们使用
.name
属性作为对象键,从非重复项构建一个对象。完成后,我们从该对象获取值数组

var data = [ your data ];

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

下面的代码是一个基本的过滤器,它类似于for..loop,您可以在其中返回true或false来删除或保留该项

我们可以使用
map
方法创建一个临时数组,然后使用
indexOf
方法查看是否可以在
map
中找到相同的对象。如果我们这样做了,那么我们知道这是一个复制品

var记录=[{国家:“AM”,名称:“Abovyan”,lat:40.27368,lng:44.63348},{国家:“AM”,名称:“Abovyan”,lat:40.04851,lng:44.54742},{国家:“AM”,名称:“Kapan”,lat:39.20755,lng:46.4057}];
功能移除副本(myArr,道具){
返回myArr.过滤器((obj、pos、arr)=>{
返回arr.map(mapObj=>mapObj[prop]).indexOf(obj[prop])==pos;
});
}
日志(删除副本(记录,“名称”)
您可以为该输出
Array.reduce()

var arr=[{国家:“AM”,名称:“Abovyan”,纬度:40.27368,液化天然气:44.63348},{国家:“AM”,名称:“Abovyan”,纬度:40.04851,液化天然气:44.54742},
{国家:“AM”,名称:“Kapan”,拉丁美洲:39.20755,液化天然气:46.4057}];
var res=arr.reduce((acc,obj)=>{
var exist=acc.find(({country,name})=>obj.country==country&&obj.name==name);
如果(!存在){
加速推力(obj);
}
返回acc;
},[]);

控制台日志(res)您可以筛选出键中不存在的元素:

 const unique = (arr, key) => {
   const keys = new Set();
   return arr.filter(el => !keys.has(el[key]) && keys.add(el[key]));
 };

因此,在您的例子中,您可以将其用作
唯一([/*…*/,“name”)

您想为name Abovyan保留哪个值?迭代数组,创建一个空对象,将键作为名称,值作为对象,它将保留最后一个几何信息对象。我不想使用对象。@NorayrGhukasyan如果您不想使用对象,可以,但您应该在问题描述中提到这一点我假设你已经有了一个使用object的解决方案,并且你正在寻找一个没有object的可能解决方案。为什么你不想使用object呢?虽然这个代码片段可能就是解决方案,但确实有助于提高你文章的质量。记住这些人可能不知道您的代码建议的原因。
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);