-2

I have the following array of objects with dynamic elements:

[
    {
        "Value1": [
            "name",
            "surname",
            "age"
        ],
        "Value2": [
            "name"
        ],
        "Value3": [
            "name",
            "age"
        ]
    },
    {
        "Value2": [
            "name",
            "age"
        ],
        "Value3": [
            "surname",
            "name"
        ]
    },
    {
        "Value1": [
            "hoursWorked"
        ],
        "Value3": [
            "name",
            "surname",
            "age"
        ]
    },
    {
        "Value2": [
            "hoursWorked"
        ]
    },
    {
        "Value2": [
            "age",
            "hoursWorked"
        ]
    },
    {
        "Value3": [
            "name",
            "surname",
            "timeSpent"
        ]
    },
    {
        "Value3": [
            "hoursWorked",
            "name"
        ]
    },
    {
        "Value1": [
            "name",
            "hoursWorked",
            "timeSpent"
        ]
    },
    {
        "Value1": [
            "surnmae",
            "age"
        ]
    },
    {
        "Value2": [
            "age",
            "hoursWorked"
        ]
    },
    {
        "Value1": [
            "name",
            "surname",
            "age"
        ],
        "Value2": [
            "name"
        ],
        "Value3": [
            "name",
            "age"
        ]
    },
    {
        "Value2": [
            "name",
            "age"
        ],
        "Value3": [
            "surname",
            "name"
        ]
    },
    {
        "Value1": [
            "hoursWorked"
        ],
        "Value3": [
            "name",
            "surname",
            "age"
        ]
    },
    {
        "Value2": [
            "hoursWorked"
        ]
    },
    {
        "Value2": [
            "age",
            "hoursWorked"
        ]
    },
    {
        "Value3": [
            "name",
            "surname",
            "timeSpent"
        ]
    },
    {
        "Value3": [
            "hoursWorked",
            "name"
        ]
    },
    {
        "Value1": [
            "name",
            "hoursWorked",
            "timeSpent"
        ]
    },
    {
        "Value1": [
            "surnmae",
            "age"
        ]
    },
    {
        "Value2": [
            "age",
            "hoursWorked"
        ]
    }
]

I need to achieve the following result:

{
        "Value1": [
            "name",
            "surname",
            "age",
            "hoursWorked",
            "timeSpent"
        ],
        "Value2": [
            "name",
            "age",
            "hoursWorked"
        ],
        "Value3": [
            "name",
            "age",
            "surname",
            "timeSpent",
            "hoursWorked"
        ]
}

Could someone help me figure out how to solve this. I tried with array.reduce() but could not achieve what I wanted. Also all the elements from "Value1", "Value2".... "name", "surname" etc are dynamic. I would greatly appreciate your help.

user1234567
  • 37
  • 1
  • 10
  • What do you want to achieve, it is little vague for me to understand. Can you add more context? – Apoorva Chikara Apr 13 '21 at 13:39
  • The expected structure is not value, I think it will be an object having all unique keys – wahab memon Apr 13 '21 at 13:41
  • I want to add all the strings in only one object. Example: all the "Value1" have multiple strings and I need to add each one to only one final "Value1" without repetition – user1234567 Apr 13 '21 at 13:42
  • Does this answer your question? [How to get distinct values from an array of objects in JavaScript?](https://stackoverflow.com/questions/15125920/how-to-get-distinct-values-from-an-array-of-objects-in-javascript) – Dane Brouwer Apr 13 '21 at 13:45

3 Answers3

1

I have achieved this using nested for loops:

var temp = [
    {
        "Value1": [
            "name",
            "surname",
            "age"
        ],
        "Value2": [
            "name"
        ],
        "Value3": [
            "name",
            "age"
        ]
    },
    {
        "Value2": [
            "name",
            "age"
        ],
        "Value3": [
            "surname",
            "name"
        ]
    },
    {
        "Value1": [
            "hoursWorked"
        ],
        "Value3": [
            "name",
            "surname",
            "age"
        ]
    },
    {
        "Value2": [
            "hoursWorked"
        ]
    },
    {
        "Value2": [
            "age",
            "hoursWorked"
        ]
    },
    {
        "Value3": [
            "name",
            "surname",
            "timeSpent"
        ]
    },
    {
        "Value3": [
            "hoursWorked",
            "name"
        ]
    },
    {
        "Value1": [
            "name",
            "hoursWorked",
            "timeSpent"
        ]
    },
    {
        "Value1": [
            "surnmae",
            "age"
        ]
    },
    {
        "Value2": [
            "age",
            "hoursWorked"
        ]
    },
    {
        "Value1": [
            "name",
            "surname",
            "age"
        ],
        "Value2": [
            "name"
        ],
        "Value3": [
            "name",
            "age"
        ]
    },
    {
        "Value2": [
            "name",
            "age"
        ],
        "Value3": [
            "surname",
            "name"
        ]
    },
    {
        "Value1": [
            "hoursWorked"
        ],
        "Value3": [
            "name",
            "surname",
            "age"
        ]
    },
    {
        "Value2": [
            "hoursWorked"
        ]
    },
    {
        "Value2": [
            "age",
            "hoursWorked"
        ]
    },
    {
        "Value3": [
            "name",
            "surname",
            "timeSpent"
        ]
    },
    {
        "Value3": [
            "hoursWorked",
            "name"
        ]
    },
    {
        "Value1": [
            "name",
            "hoursWorked",
            "timeSpent"
        ]
    },
    {
        "Value1": [
            "surnmae",
            "age"
        ]
    },
    {
        "Value2": [
            "age",
            "hoursWorked"
        ]
    }
];

var obj = {};
temp.forEach(arr => {
for(var i in arr){
if(!obj[i]){
obj[i] = [];
}
arr[i].forEach(objVal=>{
if(obj[i].indexOf(objVal) == -1){
obj[i].push(objVal);
}
})
}
});

console.log(obj);
wahab memon
  • 2,193
  • 2
  • 10
  • 23
1

Try this,

// Object to store final result
let final = {};

// Iterate over first level array 
data.forEach(obj => {

  // Iterate over key value pairs
  for (let k in obj) {

    // If key not found, initialize with empty array
    if (!final[k]) {
      final[k] = [];
    }

    // Iterate over second level array
    for (let v of obj[k]) {
      // Push to array if not already present
      if (final[k].indexOf(v) == -1) {
        final[k].push(v);
      }
    }
  }

});

Demo : https://stackblitz.com/edit/typescript-nzefuq?file=index.ts

MonkeyScript
  • 4,776
  • 1
  • 11
  • 28
1

You can use reduce for it and new Set for duplicates

var source = [
    {
        "Value1": [
            "name",
            "surname",
            "age"
        ],
        "Value2": [
            "name"
        ],
        "Value3": [
            "name",
            "age"
        ]
    },
    {
        "Value2": [
            "name",
            "age"
        ],
        "Value3": [
            "surname",
            "name"
        ]
    },
    {
        "Value1": [
            "hoursWorked"
        ],
        "Value3": [
            "name",
            "surname",
            "age"
        ]
    },
    {
        "Value2": [
            "hoursWorked"
        ]
    },
    {
        "Value2": [
            "age",
            "hoursWorked"
        ]
    },
    {
        "Value3": [
            "name",
            "surname",
            "timeSpent"
        ]
    },
    {
        "Value3": [
            "hoursWorked",
            "name"
        ]
    },
    {
        "Value1": [
            "name",
            "hoursWorked",
            "timeSpent"
        ]
    },
    {
        "Value1": [
            "surnmae",
            "age"
        ]
    },
    {
        "Value2": [
            "age",
            "hoursWorked"
        ]
    },
    {
        "Value1": [
            "name",
            "surname",
            "age"
        ],
        "Value2": [
            "name"
        ],
        "Value3": [
            "name",
            "age"
        ]
    },
    {
        "Value2": [
            "name",
            "age"
        ],
        "Value3": [
            "surname",
            "name"
        ]
    },
    {
        "Value1": [
            "hoursWorked"
        ],
        "Value3": [
            "name",
            "surname",
            "age"
        ]
    },
    {
        "Value2": [
            "hoursWorked"
        ]
    },
    {
        "Value2": [
            "age",
            "hoursWorked"
        ]
    },
    {
        "Value3": [
            "name",
            "surname",
            "timeSpent"
        ]
    },
    {
        "Value3": [
            "hoursWorked",
            "name"
        ]
    },
    {
        "Value1": [
            "name",
            "hoursWorked",
            "timeSpent"
        ]
    },
    {
        "Value1": [
            "surnmae",
            "age"
        ]
    },
    {
        "Value2": [
            "age",
            "hoursWorked"
        ]
    }
]

var b = source.reduce((acc, val) => {
  Object.keys(val).forEach(key => {
    acc[key] = acc[key] ? [...new Set(acc[key].concat(val[key]))] :  val[key];
  })

  return acc;
}, {})

console.log(b)
PZBird
  • 321
  • 2
  • 8