user6644024
user6644024

Reputation:

indexOf method for array of objects in Javascript

I have array of objets like:

var MyArray = [] ,
    Person = {}, 

[
    {
        name: 'John',
        surname: 'Smith',
        age: '22'
    },
    {
        name: 'Jesica',
        surname: 'Garou',
        age: '31'
    },
    {
        name: 'Max',
        surname: 'Jolie',
        age: '50'
    }
]

I want to check , if my data has name 'John' that don't add new person , if not , then add new person with name 'John' and etc.

Thanks in advance .

Upvotes: 0

Views: 136

Answers (8)

rkeshri
rkeshri

Reputation: 103

var searchTerm = "John",
index = -1;
for(var i = 0, len = MyArray.length; i < len; i++) {
    if (MyArray[i].name === searchTerm) {
        alert("matched string");
        index = i;
        break;
    }
}

Upvotes: 0

toastrackengima
toastrackengima

Reputation: 8722

You'll need to loop through all of the objects and check each of their name values. At worst runs in O(n) time.

For example, to check if "John" is a name in the array:

var inArray = false; // Have we found the name in the array yet?
for (var i = 0; i < MyArray.length; i++) { // Loop through the array of objects
    if (MyArray[i].name=="John") { // If the name field is equal to "John"
        inArray = true; // Name is in the array
        break; // Exit the loop
    }
}

Upvotes: 0

Jonas Wilms
Jonas Wilms

Reputation: 138237

Maybe a name Map could be useful:

var byNam e =new Map(myArray.map(el=>[el.name,el]));

So you can easily do:

if (byName.has("John")){
  alert("already exists");
} else {
  var obj = { name: "John" };
  Map.set(obj.name,obj);
  myArray.push(obj);
}

The upper can be achieved with a Set also, but you may also want to do this:

byName.get("John").age=15;

Upvotes: 0

kind user
kind user

Reputation: 41893

You could deal with it using Array#find. I assume that you want to mutate your original array.

let arr = [{
    name: 'Jesica',
    surname: 'Garou',
    age: '31'
  },
  {
    name: 'Max',
    surname: 'Jolie',
    age: '50'
  }
];

const obj = {
  name: 'John',
  surname: 'Smith',
  age: '22'
};

const ensure = ({ name, ...z }) => {
  if (!arr.find(v => v.name === name)) {
    arr.push({ name, ...z });
  }
}

ensure(obj);

console.log(arr);

Upvotes: 3

Niroda
Niroda

Reputation: 318

You can use map but you have to know that map iterates through all elements in the array, whereas findIndex returns the first element index that equals the condition and stops the loop.

var MyArray = [
    {
        name: 'John',
        surname: 'Smith',
        age: '22'
    },
    {
        name: 'Jesica',
        surname: 'Garou',
        age: '31'
    },
    {
        name: 'Max',
        surname: 'Jolie',
        age: '50'
    }
];

if(MyArray.findIndex(index => index.name === "John") > -1)
  console.log("Found!");
else
    console.log("Not found!");

Upvotes: 2

Alexandre Senges
Alexandre Senges

Reputation: 1579

You can make a search function like this that:

const index = (array, name) => {
  // Search for the string "name" in your array
  for (let i in array){
    // Look at every element in the array, if an element has the
    // corresponding name, return its index
    if (array[i].name === name) return i;
  }
  return -1;
  // If you found nothing, return -1
}

let position = index(myArray, "John");

Upvotes: -1

Anurag Singh Bisht
Anurag Singh Bisht

Reputation: 2753

To check if a name already exists in an array, you can make use of array.some function. It will check if name provided already exits or not.

If not then you can write the code to push the object in the array.

I have used the sample names John and Anne. For John, the function isAlreadyPresent returns true. For Anne, it returns false.

let arr = [
    {
        name: 'John',
        surname: 'Smith',
        age: '22'
    },
    {
        name: 'Jesica',
        surname: 'Garou',
        age: '31'
    },
    {
        name: 'Max',
        surname: 'Jolie',
        age: '50'
    }
];

function isAlreadyPresent(name) {
  return arr.some(a => a.name === name );
}

console.log('John already exists?',isAlreadyPresent('John'));
console.log('Anne already exists?',isAlreadyPresent('Anne'));

Upvotes: 2

mount2010
mount2010

Reputation: 60

Traditionally we use a constructor to build many similar objects. However, how that is OOP and is out of the scope of what you are asking.

Here we can use a for... in loop to iterate though MyArray, and check that each object does not include the name John.

function addJohn () {
for (let iterator in MyArray) { // You can also use for... of, but it will break in Node.
     if (MyArray[iterator].name == "John") {return}; //You can also replace the string with a variable name to check that all objects do not have the variable in them.
     else continue;
}
// you can now put in your new object here.
}

Upvotes: -2

Related Questions