-1

I have 2 arrays based on the "Form_Name" key value to merge an array with added new key&value "isChecked".

Array One

arrayOne = [
{id: 11, Form_Name: "form name One", isChecked: true}
{id: 11, Form_Name: "form name Two", isChecked: true}];

Array Two

arrayTwo = [
{Form_Name: "form name One", Form_AddDate: "2019-05-15T11:03:18.05"}
{Form_Name: "form name Two", Form_AddDate: "2019-05-15T11:03:18.05"}
{Form_Name: "form name Three", Form_AddDate: "2019-05-15T11:03:18.05"}
{Form_Name: "form name Four", Form_AddDate: "2019-05-15T11:03:18.05"}];

Expected merged array

mergedArray = [
{Form_Name: "form name One", Form_AddDate: "2019-05-15T11:03:18.05", isChecked: true}
{Form_Name: "form name Two", Form_AddDate: "2019-05-15T11:03:18.05", isChecked: true}
{Form_Name: "form name Three", Form_AddDate: "2019-05-15T11:03:18.05", isChecked: false}
{Form_Name: "form name Four", Form_AddDate: "2019-05-15T11:03:18.05", isChecked: false}]

I tried like below

const mergedArray = [];
for (let i = 0; i < arrayTwo.length; i++) {
  mergedArray.push({
   ...arrayTwo[i],
   ...(arrayOne.find((itmInner) => itmInner.Form_Name === arrayTwo[i].Form_Name))}
  );
}
console.log('merged array result', mergedArray);
imjayabal
  • 805
  • 1
  • 12
  • 24

3 Answers3

2
 const hasChecked = new Set(arrayOne.map(it => it.Form_Name));

 const result = arrayTwo.map(it => ({ ...it, isChecked: hasChecked.has(it.Form_Name) }));

By creating a set of checked form names, you can easily map over the second array of objects, and add a isChecked property.

Jonas Wilms
  • 132,000
  • 20
  • 149
  • 151
  • While this approach works, it is not efficient to create a `Set` and iterating over the array anyways – Ayush Gupta May 29 '19 at 11:11
  • 1
    This solution has linear time complexity, while all other solutions provided have quadratic complexity. So this is the most efficient solution so far (in terms of performance) – Jonas Wilms May 29 '19 at 11:14
  • Instead of a Set though, mapping the array to an object would work better – Ayush Gupta May 29 '19 at 11:23
0

let arrayOne = [{
  id: 11,
  Form_Name: "form name One",
  isChecked: true
}, {
  id: 11,
  Form_Name: "form name Two",
  isChecked: true
}];

let arrayTwo = [{
  Form_Name: "form name One",
  Form_AddDate: "2019-05-15T11:03:18.05"
}, {
  Form_Name: "form name Two",
  Form_AddDate: "2019-05-15T11:03:18.05"
}, {
  Form_Name: "form name Three",
  Form_AddDate: "2019-05-15T11:03:18.05"
}, {
  Form_Name: "form name Four",
  Form_AddDate: "2019-05-15T11:03:18.05"
}];

let arrayOneObj = arrayOne.reduce((result, item) => {
  result[item.Form_Name] = item.isChecked
  return result;
}, {})

const result = arrayTwo.map((item) => ({ ...item,
  isChecked: !!arrayOneObj[item.Form_Name]
}))

console.log(result);
Ayush Gupta
  • 8,716
  • 8
  • 59
  • 92
0

Try this if the form_name is in the same order in both arrays.

arrayOne = [
{id: 11, Form_Name: "form name One", isChecked: true},
{id: 11, Form_Name: "form name Two", isChecked: true},
{id: 11, Form_Name: "form name Three", isChecked: true},
{id: 11, Form_Name: "form name Four", isChecked: true}]

arrayTwo = [
{Form_Name: "form name One", Form_AddDate: "2019-05-15T11:03:18.05"},
{Form_Name: "form name Two", Form_AddDate: "2019-05-15T11:03:18.05"},
{Form_Name: "form name Three", Form_AddDate: "2019-05-15T11:03:18.05"},
{Form_Name: "form name Four", Form_AddDate: "2019-05-15T11:03:18.05"}]

let mergedArray = []

arrayTwo.forEach( (item,i) => { mergedArray.push(Object.assign({}, item, arrayOne[i]))} )

console.log(mergedArray)

Hope it helps !

JustAnotherGirl
  • 311
  • 3
  • 5