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);