0

I'm using Lodash. I have the array below:

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

and I'm about to add another object to this array but before that, I need to check if the new object's name is already in the array or not and if there is one with the name I won't add the new object anymore. I know some ways to do it, for instance, a loop with _.map, but want to make sure if there is an easier way.

4 Answers 4

2

You could use Lodash's some which if provided with an appropriate predicate e.g. (item => item.name === newName) will return a boolean indicating whether or not the item already exists (in this case, true would mean the name already exists). The benefit of using this over other iterating methods is that it will stop as soon as it finds one that returns true resulting in better performance.

Sign up to request clarification or add additional context in comments.

Comments

0

With native javascript , you can use findIndex, this will return the index of the object where the name matches. If it returns -1 then there is no such object with same name. In that case update the array.

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);

3 Comments

thanks, that is nice but i needed to do it via Lodash, but thanks anyway
if you can use loadash you can use js also
i know that, but lodash makes it shorter and easier to document
0

You don't need lodash for some. You get that with native JS too (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);

Comments

0

Doing this with lodash is few chars shorter but here is how you could do it with ES6 and 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)

Same idea with lodash and _.some would be:

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>

Note that you could also use various other ways to get the same result. Array.find or _.find would work as well since all you have to do is to check if there was a hit:

const maybeUpdate = (arr, obj) => {
  if(!_.find(array, {id: obj.id})) // or if(!array.find(x => x.id == obj.id))
    array.push(obj)
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.