Javascript:使用单个属性删除对象数组中的重复项

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

我有这样的对象,其中'id'是唯一的。我需要从小于ES5的任何版本的JavaScript中的对象数组中删除重复项。我需要根据ID字段进行比较,并删除其重复项。

示例:

Object = [
{id: id_one, value: value_one, label: ABC},
{id: id_one, value: value_one, label: ABC},
{id: id_three, value: value_three, label: ABX},
{id: id_two, value: value_two, label: ABY},
{id: id_four, value: value_four, label: ABD}
];

输出:

result = [
{id: id_one, value: value_one, label: ABC},
{id: id_three, value: value_three, label: ABX},
{id: id_two, value: value_two, label: ABY},
{id: id_four, value: value_four, label: ABD}
];

我尝试过这样的逻辑,

function getDistValues(object) {
  var distObject = [];
  var tempIndex = [];
  var length = object.length;

  for (var i = 0; i < length; i++) {
    tempIndex.push(object[i].id);

    if (tempIndex.indexOf(object[i].id) === -1 || i === 0) {
      distObject.push(object[i]);
    }
  }

  return distObject;
}

它只是给第一个对象。我尝试过映射ID并进行比较,但没有用。

任何帮助都会对我有用。

javascript object duplicates
4个回答
0
投票

这是因为您总是将id添加到tempIndex数组,因此它总是认为当前的ID是重复的。试试:

function getDistValues(object) {
  var distObject = [];
  var tempIndex = [];
  var length = object.length;

  for (var i = 0; i < length; i++) {    
    if (tempIndex.indexOf(object[i].id) === -1 || i === 0) {
      tempIndex.push(object[i].id);
      distObject.push(object[i]);
    }
  }

  return distObject;
}

0
投票

这里是使用reduce和object的解决方案

const input = [
{id: 'id_one', value: 'value_one', label: 'ABC'},
{id: 'id_one', value: 'value_one', label: 'ABC'},
{id: 'id_three', value: 'value_three', label: 'ABX'},
{id: 'id_two', value: 'value_two', label: 'ABY'},
{id: 'id_four', value: 'value_four', label: 'ABD'}
]

const output = Object.values(
  input.reduce((memo, curr) => {
    memo[curr.id] = curr
    return memo
  }, {})
)

console.log(output)

0
投票

您正在将项目添加到tempIndex数组*,然后检查它们是否在那里。由于您总是添加每一项,因此隐含的是,当您进行检查时,该项已经存在。

您必须将其取反-检查项目是否存在然后将其添加到tempIndex

var data = [
  {id: "id_one", value: "value_one", label: "ABC"},
  {id: "id_one", value: "value_one", label: "ABC"},
  {id: "id_three", value: "value_three", label: "ABX"},
  {id: "id_two", value: "value_two", label: "ABY"},
  {id: "id_four", value: "value_four", label: "ABD"}
];

function getDistValues(object) {
  var distObject = [];
  var tempIndex = [];
  var length = object.length;

  for (var i = 0; i < length; i++) {
    //check first
    var exists = tempIndex.indexOf(object[i].id) === -1;
    
    if (exists) {
      tempIndex.push(object[i].id);
      //add later
      distObject.push(object[i]);
    }
  }

  return distObject;
}

var result = getDistValues(data);

console.log(result);

0
投票

您可以将Set作为Set属性,如果id未在集合中,则进行过滤。

id
var array = [{ id: 'id_one', value: 'value_one', label: 'ABC' }, { id: 'id_one', value: 'value_one', label: 'ABC' }, { id: 'id_three', value: 'value_three', label: 'ABX' }, { id: 'id_two', value: 'value_two', label: 'ABY' }, { id: 'id_four', value: 'value_four', label: 'ABD' }],
    unique = array.filter((ids => ({ id }) => !ids.has(id) && ids.add(id))(new Set));

console.log(unique);
© www.soinside.com 2019 - 2024. All rights reserved.