5

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)

    }
  }
}

4 Answers 4

3

You can use a combination of reduce and spread to compute 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>

Sign up to request clarification or add additional context in comments.

1 Comment

Hmm, clever to put the data in the HTML pane :)
1

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)

Comments

1

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; }

Comments

1

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.