Javascript: установите значение уважаемой индексной переменной в true, если массив имеет повторяющиеся значения - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть массив объектов, который может содержать повторяющиеся значения.

Я хочу, чтобы значение переменной индекса массива было равно true, если в этих индексах есть повторяющиеся значения.

Допустим, у меня есть ниже массив объектов

let arr = [
    {
        name :'abc',
        age : 20,
    },

    {
        name :'xyz',
        age : 25,
    },

    {
        name :'pqr',
        age : 22,
    },

    {
        name :'abc',
        age : 27,
    },

    {
        name :'abc',
        age : 26,
    },
]

так что есть 3-й и 4-й индексы с дублирующимся именем в качестве 0-го индекса. Я хочу установить для переменной isError значение true для 3-го и 4-го индекса, а для других я бы хотел установить значение false.

Любая помощь будет отличной.

Спасибо.

Ответы [ 3 ]

1 голос
/ 18 апреля 2019

Используйте набор для хранения существующих имен и сопоставления массива.Проверьте в наборе, существует ли имя, и присвойте переменную isError.Добавьте текущее имя в набор.Создайте новый объект с исходным содержимым и isError:

const markDuplicates = arr => {
  const existingIds = new Set();
  
  return arr.map(o => {
    const isError = existingIds.has(o.name)
    
    existingIds.add(o.name)
    
    return { ...o, isError };
  })
}

const arr = [{"name":"abc","age":20},{"name":"xyz","age":25},{"name":"pqr","age":22},{"name":"abc","age":27},{"name":"abc","age":26}]

const result = markDuplicates(arr)

console.log(result)
0 голосов
/ 18 апреля 2019

Вы можете сначала отсортировать массив, а затем использовать map.После сортировки все объекты будут отсортированы в порядке возрастания имени.Затем используйте map, который вернет новый массив, и при возврате проверьте, совпадает ли name в текущем объекте с предыдущим объектом.Если это так, то добавьте дубликат ключа и присвойте ему значение

 if (index !== 0 && item.name == k[index - 1].name) {

В этой строке пропущена проверка первого объекта в отсортированном массиве, потому что с предыдущим объектом копировать нечего, а item.name == k[index - 1].name проверяетесли имя совпадает с предыдущим объектом

let arr = [{
    name: 'abc',
    age: 20,
  },

  {
    name: 'xyz',
    age: 25,
  },

  {
    name: 'pqr',
    age: 22,
  },

  {
    name: 'abc',
    age: 27,
  },

  {
    name: 'abc',
    age: 26,
  },
];
let k = arr.sort(function(a, b) {
  return a.name.localeCompare(b.name);
});
let z = k.map(function(item, index) {
  if (index !== 0 && item.name == k[index - 1].name) {
    return {
      name: item.name,
      age: item.age,
      duplicate: true
    }
  } else {
    return {
      name: item.name,
      age: item.age
    }
  }
});
console.log(z)
0 голосов
/ 18 апреля 2019

Вы можете использовать object в качестве трекера, добавить ключ с помощью name,

Проходить по данным, если имя уже доступно на op в качестве ключа, затем изменить текущий элемент isError свойствона true иначе создайте новый ключ на op и установите текущий элемент isError на false

let arr = [{name :'abc',age : 20,},{name :'xyz',age : 25,},{name :'pqr',age : 22,},{name :'abc',age : 27,},{name :'abc',age : 26,},]

let op = {}

arr.forEach( (inp,index) => {
  if( op[inp.name] ){
    inp.isError = true
  } else{
    inp.isError = false
    op[inp.name] = inp
  }
})

console.log(arr)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...