删除包含重复属性的嵌套对象

问题描述 投票:0回答:2

我这里有一个嵌套对象

{ people: {
    bob: {
      city: 'florida',
      phone: '561-482-2234'
    },
    jen: {
      city: 'florida',
      phone: '407-382-3883'
    },
    kim: {
      city: 'new york',
      phone: '607-321-3003'
    }
}}

我需要过滤此对象,以便不存在重复的城市 - 最终结果将是包含bob和kim的对象。我不关心订购或两个佛罗里达人中的哪一个留在对象中,所以它也可以是jen&kim

我当前的实现包含一个for循环,遍历people,存储临时密钥,如果名称与临时密钥匹配,则删除嵌套对象。我觉得这是一个漫长的解决方案

有没有ES6方法可以达到这个目的?

javascript
2个回答
2
投票

您可以使用Set过滤密钥并删除此密钥。

var a = { people: { bob: { city: 'florida', phone: '561-482-2234' }, jen: { city: 'florida', phone: '407-382-3883' }, kim: { city: 'new york', phone: '607-321-3003' } } };

Object
    .keys(a.people)
    .filter((s => k => s.has(a.people[k].city) || !s.add(a.people[k].city))(new Set))
    .forEach(k => { delete a.people[k]; });

console.log(a);
.as-console-wrapper { max-height: 100% !important; top: 0; }

1
投票

使用reduce

var a = {
  people: {
    bob: {
      city: 'florida',
      phone: '561-482-2234'
    },
    jen: {
      city: 'florida',
      phone: '407-382-3883'
    },
    kim: {
      city: 'new york',
      phone: '607-321-3003'
    }
  }
};
Object.keys(a.people).reduce((acc, e) => {
acc.includes(a.people[e].city) ? delete a.people[e] : acc.push(a.people[e].city);
  return acc
}, [])
console.log(a)

使用forEach循环

var a = {
  people: {
    bob: {
      city: 'florida',
      phone: '561-482-2234'
    },
    jen: {
      city: 'florida',
      phone: '407-382-3883'
    },
    kim: {
      city: 'new york',
      phone: '607-321-3003'
    }
  }
};
var cities = [];
Object.keys(a.people).forEach((e) => {
  if (cities.includes(a.people[e].city))
    delete a.people[e];
  else
    cities.push(a.people[e].city);
})
console.log(a)
© www.soinside.com 2019 - 2024. All rights reserved.