I am new to JS
. I have a list of Objects which looks like below,
var a = [
{
wa_id: 1,
wa_property_id: 'p1',
wa_view_name: 'ram'
},
{
wa_id: 1,
wa_property_id: 'p1',
wa_view_name: 'sam'
},
{
wa_id: 1,
wa_property_id: 'p2',
wa_view_name: 'kam'
},
{
wa_id: 2,
wa_property_id: 'p5',
wa_view_name: 'pri'
},
{
wa_id: 1,
wa_property_id: 'p3',
wa_view_name: 'ste',
},
]
I want to iterate over these objects and create a new separate object. I want the required Output like below
Required Output:
{
"1": {
"p1": ["ram", "sam"],
"p2": ["kam"],
"p3": ["ste"]
},
"2": {
"p5": ["pri"]
}
}
Here's the Code I tried,
var a = [{
wa_id: 1,
wa_property_id: 'p1',
wa_view_name: 'ram'
},
{
wa_id: 1,
wa_property_id: 'p1',
wa_view_name: 'sam'
},
{
wa_id: 1,
wa_property_id: 'p2',
wa_view_name: 'kam'
},
{
wa_id: 2,
wa_property_id: 'p5',
wa_view_name: 'pri'
},
{
wa_id: 1,
wa_property_id: 'p3',
wa_view_name: 'ste',
},
]
temp_obj = {}
temp_list = []
for (var j = 0; j < a.length; j++) {
temp_list.push(a[j].wa_property_id)
}
temp_list.splice(0, temp_list.length, ...(new Set(temp_list)))
// Property ID List
console.log(temp_list)
// Output: ["p1","p2","p5","p3"]
properyViewObj = {}
temp_list2 = []
for (var j = 0; j < temp_list.length; j++) {
for (var k = 0; k < a.length; k++) {
if (a[k].wa_property_id == temp_list[j]) {
temp_list2.push(a[k].wa_view_name)
}
}
properyViewObj[temp_list[j]] = temp_list2
temp_list2 = []
}
// Property with Viewnames
console.log(properyViewObj)
// Output: {p1: ["ram","sam"],p2: ["kam"],p5: ["pri"],p3: ["ste"]}
var wa_list = []
for (var j = 0; j < a.length; j++) {
wa_list.push(a[j].wa_id)
}
wa_list.splice(0, wa_list.length, ...(new Set(wa_list)))
// Wa_id List
console.log(wa_list)
// Output: [1,2]
// How to make the Next Step
var output = {}
var tem = []
for (var j = 0; j < wa_list.length; j++) {
for (var k = 0; k < a.length; k++) {
if (a[k].wa_id == wa_list[j]) {
console.log(a[k].wa_property_id)
}
}
}
I am new to JS
. I have a list of Objects which looks like below,
var a = [
{
wa_id: 1,
wa_property_id: 'p1',
wa_view_name: 'ram'
},
{
wa_id: 1,
wa_property_id: 'p1',
wa_view_name: 'sam'
},
{
wa_id: 1,
wa_property_id: 'p2',
wa_view_name: 'kam'
},
{
wa_id: 2,
wa_property_id: 'p5',
wa_view_name: 'pri'
},
{
wa_id: 1,
wa_property_id: 'p3',
wa_view_name: 'ste',
},
]
I want to iterate over these objects and create a new separate object. I want the required Output like below
Required Output:
{
"1": {
"p1": ["ram", "sam"],
"p2": ["kam"],
"p3": ["ste"]
},
"2": {
"p5": ["pri"]
}
}
Here's the Code I tried,
var a = [{
wa_id: 1,
wa_property_id: 'p1',
wa_view_name: 'ram'
},
{
wa_id: 1,
wa_property_id: 'p1',
wa_view_name: 'sam'
},
{
wa_id: 1,
wa_property_id: 'p2',
wa_view_name: 'kam'
},
{
wa_id: 2,
wa_property_id: 'p5',
wa_view_name: 'pri'
},
{
wa_id: 1,
wa_property_id: 'p3',
wa_view_name: 'ste',
},
]
temp_obj = {}
temp_list = []
for (var j = 0; j < a.length; j++) {
temp_list.push(a[j].wa_property_id)
}
temp_list.splice(0, temp_list.length, ...(new Set(temp_list)))
// Property ID List
console.log(temp_list)
// Output: ["p1","p2","p5","p3"]
properyViewObj = {}
temp_list2 = []
for (var j = 0; j < temp_list.length; j++) {
for (var k = 0; k < a.length; k++) {
if (a[k].wa_property_id == temp_list[j]) {
temp_list2.push(a[k].wa_view_name)
}
}
properyViewObj[temp_list[j]] = temp_list2
temp_list2 = []
}
// Property with Viewnames
console.log(properyViewObj)
// Output: {p1: ["ram","sam"],p2: ["kam"],p5: ["pri"],p3: ["ste"]}
var wa_list = []
for (var j = 0; j < a.length; j++) {
wa_list.push(a[j].wa_id)
}
wa_list.splice(0, wa_list.length, ...(new Set(wa_list)))
// Wa_id List
console.log(wa_list)
// Output: [1,2]
// How to make the Next Step
var output = {}
var tem = []
for (var j = 0; j < wa_list.length; j++) {
for (var k = 0; k < a.length; k++) {
if (a[k].wa_id == wa_list[j]) {
console.log(a[k].wa_property_id)
}
}
}
Share
Improve this question
edited Apr 2, 2020 at 11:38
mplungjan
179k28 gold badges182 silver badges240 bronze badges
asked Apr 2, 2020 at 11:35
Stack KiddyStack Kiddy
5861 gold badge5 silver badges10 bronze badges
4 Answers
Reset to default 3You can use a bination of reduce and spread to pute your object.
const data = a.reduce((lkp, obj, i) => {
const {wa_id, wa_property_id, wa_view_name} = obj;
return {
...lkp,
[wa_id]: {
...lkp[wa_id],
[wa_property_id]: [...((lkp[wa_id] || {})[wa_property_id] || []), wa_view_name]
}
}
}, {})
console.log (data)
<script>
var a = [{
wa_id: 1,
wa_property_id: 'p1',
wa_view_name: 'ram'
},
{
wa_id: 1,
wa_property_id: 'p1',
wa_view_name: 'sam'
},
{
wa_id: 1,
wa_property_id: 'p2',
wa_view_name: 'kam'
},
{
wa_id: 2,
wa_property_id: 'p5',
wa_view_name: 'pri'
},
{
wa_id: 1,
wa_property_id: 'p3',
wa_view_name: 'ste',
},
]
</script>
YOu can try reduce your array to object
var a = [
{
wa_id: 1,
wa_property_id: 'p1',
wa_view_name: 'ram'
},
{
wa_id: 1,
wa_property_id: 'p1',
wa_view_name: 'sam'
},
{
wa_id: 1,
wa_property_id: 'p2',
wa_view_name: 'kam'
},
{
wa_id: 2,
wa_property_id: 'p5',
wa_view_name: 'pri'
},
{
wa_id: 1,
wa_property_id: 'p3',
wa_view_name: 'ste',
},
]
let result = a.reduce((acc,rec) =>{
//if result object doesn't contain key for wa_id - add new id key
if(!(Object.keys(acc).includes(rec.wa_id.toString())))
{
return {...acc, [rec.wa_id]: {[rec.wa_property_id]:[rec.wa_view_name]}}
}
//if result id object doesn't contain key for property - add new property key
if(!(Object.keys(acc[rec.wa_id]).includes(rec.wa_property_id.toString())))
{
acc[rec.wa_id] = {...acc[rec.wa_id],[rec.wa_property_id]:[rec.wa_view_name] }
return acc
}
//otherwise add new value to array of properties
acc[rec.wa_id][rec.wa_property_id] = [...acc[rec.wa_id][rec.wa_property_id], rec.wa_view_name]
return acc
},{})
console.log(result)
You could take an array of keys and reduce the result object.
var array = [{ wa_id: 1, wa_property_id: 'p1', wa_view_name: 'ram' }, { wa_id: 1, wa_property_id: 'p1', wa_view_name: 'sam' }, { wa_id: 1, wa_property_id: 'p2', wa_view_name: 'kam' }, { wa_id: 2, wa_property_id: 'p5', wa_view_name: 'pri' }, { wa_id: 1, wa_property_id: 'p3', wa_view_name: 'ste' }],
keys = ['wa_id', 'wa_property_id'],
grouped = array.reduce((r, o) => {
keys
.reduce((q, k, i, { length }) =>
q[o[k]] = q[o[k]] || (i + 1 === length ? [] : {}), r)
.push(o.wa_view_name);
return r;
}, {});
console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
You can use ES6 method to achieve this
const reduceObj = arr => {
// Map all item of the array
return arr.reduce((acc, item) => {
// Extract information
const { wa_id, wa_property_id, wa_view_name } = item;
const wa_id_string = wa_id.toString();
// Check if the accumulator have the value of the variable wa_id_string as property
if(acc.hasOwnProperty(wa_id_string)) {
// Update the value of property wa_property_id if it exists or assign a new one
acc[wa_id_string][wa_property_id] = acc[wa_id_string].hasOwnProperty(wa_property_id)
? [...acc[wa_id][wa_property_id], wa_view_name]
: [wa_view_name];
}
else {
// create a new property
acc[wa_id_string] = {
[wa_property_id]: [wa_view_name],
}
}
// return the accumulator
return acc;
}, {});
};
const a = [
{
wa_id: 1,
wa_property_id: 'p1',
wa_view_name: 'ram'
},
{
wa_id: 1,
wa_property_id: 'p1',
wa_view_name: 'sam'
},
{
wa_id: 1,
wa_property_id: 'p2',
wa_view_name: 'kam'
},
{
wa_id: 2,
wa_property_id: 'p5',
wa_view_name: 'pri'
},
{
wa_id: 1,
wa_property_id: 'p3',
wa_view_name: 'ste',
},
];
console.log(reduceObj(a));
I also advice you to read more about ES6 and then switch from var to let & const
More info