see
see

Reputation: 71

Use reduce to remove object in an array

I am trying to return an array that contain of one of property. So there is an array of objects like

[{x: 5, y: 607, width: 782, height: 602, line_width: 3, …},
 {x: 10, y: 602, width: 772, height: 592, line_width: 3, …},
 {x: 0, y: 400, size: 18, text: 'This cer..}, ..]

Some object has section: 'TextInstruction' property defined and some do not.

I am trying to return an array that is only containing section with no duplicate and no undefined.

So return ['TextInstruction', 'RectangleInstruction', ...]
No [undefined, 'TextInstruction', 'TextInstruction', ...]

Can anyone help me with JavaScript to get this using reduce() function?

Upvotes: 0

Views: 690

Answers (3)

Hamid Raza
Hamid Raza

Reputation: 32

You can try this:

var objectArray = {someting....}; // Your Object Array
var indexOfObject = objectArray.findIndex(object => {
    return object.section == null;
});
objectArray.splice(indexOfObject, 1);

Upvotes: 0

Carsten Massmann
Carsten Massmann

Reputation: 28196

The reduce() way of doing it could be something like this:

const data=[{a:12,b:45,section:"first"},{section:"second",d:5,f:7},{x:23,y:78,height:200},{a:445,x:34,section:"first"}];

const res1=Object.keys(data.reduce((a,c)=>{
  if(c.section) a[c.section]=1;
  return a;
 }, {}));

// Or, using the es6 Set object:
const res2=[...data.reduce((a,c)=>{
  if(c.section) a.add(c.section);
  return a;
 }, new Set())];

// show results:
console.log(res1,res2);

The second approach makes sense when the values to be collected are objects (and not only strings).

Upvotes: 0

Clem
Clem

Reputation: 2312

You don't need reduce to do that. You can do it with filter and map.

myArray
  // filter missing sections
  .filter(a => a.section)
  // map to array of sections
  .map(a => a.section)
  // filter unique
  .filter((a, i, arr) => arr.indexOf(a) === i)

Upvotes: 0

Related Questions