добавить объект в массив, если у него нет того же ключа с одним из объектов в массиве - PullRequest
0 голосов
/ 22 ноября 2018

Я использую Lodash.У меня есть массив ниже:

const array = [{id:1,name:a},{id:2,name:b},{id:3,name:c},{id:4,name:d},{id:5,name:e}];

, и я собираюсь добавить еще один объект в этот массив, но перед этим мне нужно проверить, есть ли имя нового объекта уже в массиве или нет, и если естьэто имя с именем я больше не буду добавлять новый объект.Я знаю несколько способов сделать это, например, цикл с _.map, но хочу убедиться, что есть более простой способ.

Ответы [ 4 ]

0 голосов
/ 22 ноября 2018

Выполнение этого с lodash на несколько символов короче, но вот как вы могли бы сделать это с ES6 и Array.some:

const array = [{ id: 1, name: "A" }, { id: 2, name: "B" }, { id: 3, name: "C" }, { id: 4, name: "D" }, { id: 5, name: "C" }];

const maybeUpdate = (arr, obj) => {
  if(!array.some(x => x.id == obj.id))
    array.push(obj)
}

maybeUpdate(array, {id: 2, name: "F"})   // id exists wont insert
maybeUpdate(array, {id: 12, name: "F"})  // will insert

console.log(array)

Та же идея с lodash и _. Некоторые будут:

const array = [{ id: 1, name: "A" }, { id: 2, name: "B" }, { id: 3, name: "C" }, { id: 4, name: "D" }, { id: 5, name: "C" }];

const maybeUpdate = (arr, obj) => {
  if(!_.some(array, {id: obj.id}))
    array.push(obj)
}

maybeUpdate(array, {id: 2, name: "F"})   // id exists wont insert
maybeUpdate(array, {id: 12, name: "F"})  // will insert

console.log(array)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

Обратите внимание, что вы также можете использовать различные другие способы, чтобы получить тот же результат. Array.find или _. Find также будет работать, так как все, что вам нужно сделать, это проверить, было ли попадание:

const maybeUpdate = (arr, obj) => {
  if(!_.find(array, {id: obj.id})) // or if(!array.find(x => x.id == obj.id))
    array.push(obj)
}
0 голосов
/ 22 ноября 2018

В нативном javascript вы можете использовать findIndex, это вернет индекс объекта, которому соответствует имя.Если он возвращает -1, то такого объекта с таким именем не существует.В этом случае обновите массив.

const array = [{
  id: 1,
  name: 'a'
}, {
  id: 2,
  name: 'b'
}, {
  id: 3,
  name: 'c'
}, {
  id: 4,
  name: 'd'
}, {
  id: 5,
  name: 'e'
}];

let newObjToAdd = {
  id: 1,
  name: 'z'
};
let newObjNotToAdd = {
  id: 1,
  name: 'a'
}


function updateArray(obj) {
  let k = array.findIndex((item) => {
    return item.name === obj.name;
  })
  if (k === -1) {
    array.push(obj)
  } else {
    console.log('Array contains object with this name')
  }
}

updateArray(newObjToAdd);
console.log(array)
updateArray(newObjNotToAdd);
0 голосов
/ 22 ноября 2018

Вам не нужен lodash для some.Вы получаете это с родным JS (ES6):

const array = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'},{id:4,name:'d'},{id:5,name:'e'}];

console.log(array.some(e => e.name === 'a'));

if (!array.some(e => e.name === 'z')) {
  array.push({id: 5, name: 'z'});
}

console.log(array);
0 голосов
/ 22 ноября 2018

Вы можете использовать Lodash some , который, если он снабжен соответствующим предикатом, например, (item => item.name === newName), вернет логическое значение, указывающее, существует ли элемент или нет (в этом случае true будет означать, что имя уже существует),Преимущество использования этого по сравнению с другими итеративными методами состоит в том, что он остановится, как только найдет тот, который возвращает true, что приведет к повышению производительности.

...