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

时间:2018-08-18 12:20:46

标签: 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} ]

您可以看到我有2个具有相同名称的对象(例如Abovyan),但是它们的几何信息不同。我从一些API获得此数组,我想对其进行过滤。我如何将其过滤为只有一个具有特定键/值的对象,在这种情况下,该对象具有 name

我想得到一个像这样的过滤数组`

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

5 个答案:

答案 0 :(得分:1)

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

var data = [ your data ];

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

答案 1 :(得分:1)

您可以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);

答案 2 :(得分:1)

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

答案 3 :(得分:0)

下面的代码执行类似于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"));

答案 4 :(得分:0)

您可以过滤掉键中不存在的元素:

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

因此,在您的情况下,您可以将其用作unique([/*...*/, "name")