从对象数组中删除重复项

时间:2020-09-18 07:09:20

标签: javascript angular

嗨,我正尝试使用id从对象数组中删除重复项,但是id为null,则该对象应包含这些null id并删除其他重复项

这是对象数组的示例:

const arr = [
  {
    id: 6652,
    value: "erger"
  },
  {

    id: 6652,
    value: "sdfs"
  },
  {

    id: 6653,
    value: "sdgdfg"
  },
  {

    id: 6000,
    value: "trgd"
  },
  {

    id: 6667,
    value: "asdf"
  },
  {

    id: 6667,
    value: "fdg"
  },
  {

    id: 6668,
    value: "dfgr"
  },
  {

    id: null,
    value: "fg"
  },
  {

    id: null,
    value: "dfgdf"
  },

  {

    id: null,
    value: "fg"
  },
  {

    id: null,
    value: "dfgdf"
  }
];

以下是finalResult

array = [{

    id: 6652
    value: "sdfs"
  },
  {

    id: 6653
    value: "sdgdfg"
  },
  {

    id: 6000
    value: "trgd"
  },
  {

    id: 6667
    value: "fdg"
  },
  {

    id: 6668
    value: "dfgr"
  },
  {

    id: null
    value: "fg"
  },
  {

    id: null
    value: "dfgdf"
  },

  {

    id: null
    value: "fg"
  },
  {

    id: null
    value: "dfgdf"
  }

]

在上述结果中,由于6652和6667是重复项,因此将其删除,但保留了空ID,因为我不想删除空ID并删除其他重复值。

下面是我要使用的逻辑,但是如果id为null则不起作用

array = array.filter((v,i,a)=> a.findIndex(t =>(v.id!==空&& t.id === v.id))=== i)

3 个答案:

答案 0 :(得分:0)

<div class="article">
    <div class="article__textbox">
        <h1 class="article__textbox__heading">Learning BEM </h1>
        <p class="article__textbox__subheading">The Block, Element, Modifier methodology</p>
        <span class="article__textbox__author">John Doe</span>
    </div>
</div>

<div class="article">
    <div class="article__textbox">
        <h1 class="article__textbox__heading">Mastering CSS BEM Principle </h1>
        <p class="article__textbox__subheading">The Block, Element, Modifier methodology</p>
        <span class="article__textbox__author article__textbox__author--premium">Jeanne Doe</span>
    </div>
</div>

创建一个单独的对象来跟踪遇到的对象ID,在这种情况下为const filterKeys = {}; const filtered = arr.reduce((acc, item) => { if (item.id === null || !(item.id in filterKeys)) { filterKeys[item.id] = true; acc.push(item); } return acc; }, []);

由于filterKeys是一个数组,请执行reduce来迭代该数组。如果array中的id是nil或找不到,请将该项目推入累加器并返回它以进行下一次迭代。由于我们不在乎null为null的id,因此它们不会起作用,因此不会被滤除。

答案 1 :(得分:0)

使用以下我测试过的代码对您的对象数组进行工作:

    arr.forEach(function (item) {

        if (item.id == null) {
            result.push(item);
        }
        else {
            var index = result.findIndex(x => x.id == item.id);
            if (index == -1)
            {
                result.push(item);
            }
           
        }
    });
    console.log(result)

答案 2 :(得分:-1)

您可以尝试一下-

const array = [{ id: 6652, value: 'erger' },{ id: 6652, value: 'sdfs' },{ id: 6653, value: 'sdgdfg' },{ id: 6000, value: 'trgd' },{ id: 6667, value: 'asdf' },{ id: 6667, value: 'fdg' },{ id: 6668, value: 'dfgr' },{ id: null, value: 'fg' },{ id: null, value: 'dfgdf' },{ id: null, value: 'fg' },{ id: null, value: 'dfgdf' },];
let index = 0;
const result = Object.values(
    array.reduce(
        (acc, curr) =>
            curr.id === null ? { ...acc, [index++]: curr } : { ...acc, [curr.id]: curr },
        {}
    )
);

console.log(result);
.as-console-wrapper {min-height: 100%; top: 0}