【问题标题】:Filter unique values from an array of objects [duplicate]从对象数组中过滤唯一值[重复]
【发布时间】:2017-09-08 12:06:19
【问题描述】:

如何使用 Array.filter() 返回唯一的 idname

我的方案与我研究过的解决方案略有不同,因为我有一组对象。我找到的每个示例都包含一个由单个值组成的平面数组。

data=[
{id: 555, name: "Sales", person: "Jordan" },
{id: 555, name: "Sales", person: "Bob" },
{id: 555, name: "Sales", person: "John" },
{id: 777, name: "Accounts Payable", person: "Rhoda" },
{id: 777, name: "Accounts Payable", person: "Harry" },
{id: 888, name: "IT", person: "Joe" },
{id: 888, name: "IT", person: "Jake" },
];

var unique = data.filter(
function (x, i) {
   return data[i].id.indexOf(x.id) === i
});

提前致谢。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    我认为forEach() 更能实现您的目标:

    var data=[
    {id: 555, name: "Sales", person: "Jordan" },
    {id: 555, name: "Sales", person: "Bob" },
    {id: 555, name: "Sales", person: "John" },
    {id: 777, name: "Accounts Payable", person: "Rhoda" },
    {id: 777, name: "Accounts Payable", person: "Harry" },
    {id: 888, name: "IT", person: "Joe" },
    {id: 888, name: "IT", person: "Jake" },
    ];
    var resArr = [];
    data.forEach(function(item){
      var i = resArr.findIndex(x => x.name == item.name);
      if(i <= -1){
        resArr.push({id: item.id, name: item.name});
      }
    });
    console.log(resArr);

    如果你真的想用filter()试试下面的方法:

    var data=[
    {id: 555, name: "Sales", person: "Jordan" },
    {id: 555, name: "Sales", person: "Bob" },
    {id: 555, name: "Sales", person: "John" },
    {id: 777, name: "Accounts Payable", person: "Rhoda" },
    {id: 777, name: "Accounts Payable", person: "Harry" },
    {id: 888, name: "IT", person: "Joe" },
    {id: 888, name: "IT", person: "Jake" },
    ];
    var resArr = [];
    data.filter(function(item){
      var i = resArr.findIndex(x => x.name == item.name);
      if(i <= -1){
        resArr.push({id: item.id, name: item.name});
      }
      return null;
    });
    console.log(resArr);

    【讨论】:

    • 是的,就是这样!我打算使用 for 循环,但我认为 filter 是最好的。
    • 我不明白为什么 SO 这么快就得出结论 re: 带有重复的答案。我进行了搜索,但没有找到适合我的方案的最佳解决方案。
    • 我认为 forEach 会更好,因为这种方法实际上并没有使用过滤器函数,因为它不会在函数内部返回任何内容。
    • data = data.reduce((items, item) => items.find(x => x.name === item.name) ? [...items] : [...项目,项目],[])
    • @jinglesthula 我的错,只使用第一个三元分支中的项目
    猜你喜欢
    • 1970-01-01
    • 2023-02-03
    • 2016-11-07
    • 2021-09-07
    • 1970-01-01
    • 2017-12-22
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多