Sagar Jha
Sagar Jha

Reputation: 45

How to check if a value in an array is present in other object and accordingly return a new object

I have an array

const dataCheck = ["Rohit","Ravi"];

I have another array of object

 const userData = [
    { name: "Sagar" },
    { name: "Vishal" },
    { name: "Rohit" },
    { name: "Ravi" },
  ];

I want to check if any value in dataCheck is present in the userData and then return a new array with the below data

const newData = [
    { name: "Sagar" },
    { name: "Vishal" },
    { name: "Rohit", status: "present" },
    { name: "Ravi", status: "present" },
  ];

I tried to do something using loops but not getting the expected results

const dataCheck = ["Rohit", "Ravi"];
const userData = [
  { name: "Sagar" },
  { name: "Vishal" },
  { name: "Rohit" },
  { name: "Ravi" }
];

let newDataValue = {};
let newData = [];
userData.forEach((user) => {
  const name = user.name;
  dataCheck.forEach((userName) => {
    if (name === userName) {
      newDataValue = {
        name: name,
        status: "present"
      };
    } else {
      newDataValue = {
        name: name
      };
    }

    newData.push(newDataValue);
  });
});

console.log(newData);

My trial gives me repeated results multiple results which is just duplicates

Upvotes: 0

Views: 88

Answers (6)

Tonton La Force
Tonton La Force

Reputation: 102

So you will do like this :

const dataCheck = ["Rohit","Ravi"];
const userData = [
    { name: "Sagar" },
    { name: "Vishal" },
    { name: "Rohit" },
    { name: "Ravi" },
];
const newUserData = userData.map( user => { 
     dataCheck.forEach( data => { 
          if( data === user.name ) 
             user.status = "present";
     }); 
     return user;

} );
console.log( newUserData );

Upvotes: 0

Ryan
Ryan

Reputation: 11

You are seeing repeated results due to the second loop dataCheck.forEach((userName) => { as every loop of dataCheck will fire the if/else statement and add something to the final array. However many values you add to dataCheck will be however many duplicates you get.

Only need to loop through one array and check if the value is in the other array so no duplicates get added.

const dataCheck = ["Rohit", "Ravi"];
const userData = [{ name: "Sagar" }, { name: "Vishal" }, { name: "Rohit" }, { name: "Ravi" }];

let newDataValue = {};
let newData = [];

// loop thru the users
userData.forEach((user) => {
    // set the user
    const name = user.name;

    // check if in array
    if (dataCheck.indexOf(name) >= 0) {
        newDataValue = {
            name: name,
            status: "present",
        };
    }
    // not in array
    else {
        newDataValue = {
            name: name,
        };
    }

    newData.push(newDataValue);
});

console.log(newData);

Upvotes: 0

n0x
n0x

Reputation: 1

Loop through userData, check if name is includes in dataCheck. If true add status 'present'.

const dataCheck = ["Rohit","Ravi"];

const userData = [
  { name: "Sagar" },
  { name: "Vishal" },
  { name: "Rohit" },
  { name: "Ravi" },
];

for (let user of userData) {
  if(dataCheck.includes(user.name)) {
    user.status = 'present'
  }
}

console.log(userData)

Upvotes: 0

sid
sid

Reputation: 2027

A better approach would be to use map over userData array, find for matching element in dataCheck, if found return matching element + a status key or just return the found element as it is.

const dataCheck = ["Rohit","Ravi"];

const userData = [
    { name: "Sagar" },
    { name: "Vishal" },
    { name: "Rohit" },
    { name: "Ravi" },
];

const getUpdatedObject = () => {
  return userData.map(userData => {
    const userDetail = dataCheck.find(data => userData.name === data);
    if(userDetail) return {userDetail, status:"present"}
    else return {...userData}
   });
}

console.log(getUpdatedObject())

Working fiddle

Upvotes: 0

amin keshavarzi
amin keshavarzi

Reputation: 111

const dataCheck = ["Rohit", "Ravi"];

const userData = [
  { name: "Sagar" },
  { name: "Vishal" },
  { name: "Rohit" },
  { name: "Ravi" },
];

// map through every object and check if name property
// exists in data check with help of filter. 
// if it exists the length of filter should be 1 so 
// you should return { name: el.name, status: "present" } else 
// return { name: el.name }

let newData = userData.map((el) => {
  if (dataCheck.filter((name) => name === el.name).length > 0) {
    return { name: el.name, status: "present" };
  } else {
    return { name: el.name };
  }
});

console.log("newdata: ", newData);

Upvotes: 0

Mushroomator
Mushroomator

Reputation: 9188

You should use map() and a Set.

const dataCheck = ["Rohit","Ravi"];

const userData = [
  { name: "Sagar" },
  { name: "Vishal" },
  { name: "Rohit" },
  { name: "Ravi" },
];

const set = new Set(dataCheck);
const output = userData.map(data => set.has(data.name) ? ({...data, status: "present"}): data)
console.log(output)
.as-console-wrapper { max-height: 100% !important; top: 0; }

A Set allows for lookups in O(1) time and therefore this algorithm works in O(n) time. If you would use the array for lookups (e.g. using indcludes(), find() etc.) the runtime would be O(n²). Although this will certainly not matter at all for such small arrays, it will become more relevant the larger the array gets.

map() is used here because you want a 1:1 mapping of inputs to outputs. The only thing to determine then is, what the output should be. It is either the input, if the value is not in the Set, or it is the input extended by one property status set to "present". You can check for the presence in a Set using the has() method and can use the ternary operator ? to make the decision which case it is.

Upvotes: 1

Related Questions