Andrew Howard
Andrew Howard

Reputation: 3082

Make an array from multiple arrays with common objects

I have the following json which is an array with 2 nested arrays:

[
  [
          {
            "name": "WalkBack",
            "frameRate": 15
          },
          {
            "name": "WalkFront",
            "frameRate": 15
          },
          {
            "name": "WalkLeft",
            "frameRate": 15
          },
          {
            "name": "WalkRight",
            "frameRate": 15
          },
          {
            "name": "Laughing",
            "frameRate": 15
          },
          {
            "name": "Megaphone",
            "frameRate": 15
          },
          {
            "name": "Yawning",
            "frameRate": 15
          }
        ],
        [
          {
            "name": "WalkBack",
            "frameRate": 15
          },
          {
            "name": "WalkFront",
            "frameRate": 15
          },
          {
            "name": "WalkLeft",
            "frameRate": 15
          },
          {
            "name": "WalkRight",
            "frameRate": 15
          }
        ]
]

I need to make a new array of the common object names seen in both arrays like this:

[{
            "name": "WalkBack"
          },
          {
            "name": "WalkFront"
          },
          {
            "name": "WalkLeft"
          },
          {
            "name": "WalkRight"
          }]

So in this case the walk animations are the common names. I tried using:

result = firstArray.filter(o => secondArray.some(({name}) => o.name === name));

but this only works if you know have names for the inner arrays. Any ideas?

Upvotes: 0

Views: 96

Answers (4)

rishichawda
rishichawda

Reputation: 453

Simplest would be to use the reduce method on them by taking first array as a reference. Something like this:

const data=[[{name:"WalkBack",frameRate:15},{name:"WalkFront",frameRate:15},{name:"WalkLeft",frameRate:15},{name:"WalkRight",frameRate:15},{name:"Laughing",frameRate:15},{name:"Megaphone",frameRate:15},{name:"Yawning",frameRate:15}],[{name:"WalkBack",frameRate:15},{name:"WalkFront",frameRate:15},{name:"WalkLeft",frameRate:15},{name:"WalkRight",frameRate:15}]];

const [refArr, ...rest] = data

const formattedData = refArr.reduce((commons = [], item) => {
  let isCommon = rest.every(arr => arr.some(itemInArr => item.name === itemInArr.name))
  return isCommon ? [...commons, item] : commons
}, [])

console.log(formattedData)

Upvotes: 1

ABGR
ABGR

Reputation: 5205

var arr = [
  [
          {
            "name": "WalkBack",
            "frameRate": 15
          },
          {
            "name": "WalkFront",
            "frameRate": 15
          },
          {
            "name": "WalkLeft",
            "frameRate": 15
          },
          {
            "name": "WalkRight",
            "frameRate": 15
          },
          {
            "name": "Laughing",
            "frameRate": 15
          },
          {
            "name": "Megaphone",
            "frameRate": 15
          },
          {
            "name": "Yawning",
            "frameRate": 15
          }
        ],
        [
          {
            "name": "WalkBack",
            "frameRate": 15
          },
          {
            "name": "WalkFront",
            "frameRate": 15
          },
          {
            "name": "WalkLeft",
            "frameRate": 15
          },
            {
            "name": "WalkRight",
            "frameRate": 15
          }
        ]
];
debugger;
var arr1 = arr[0], arr2 = arr[1],
myObj = {};
arr1.forEach(i=>{
 if(!myObj[i.name]){
   myObj[i.name] = true;
 }
}
);

arr2.forEach(i=>{
 if(!myObj[i.name]){
   delete myObj[i.name]
 }
})

console.log(myObj)

Upvotes: 0

Rajneesh
Rajneesh

Reputation: 5308

First you can flat your data then you reduce it and filter out records by checking length, if it has more than one value.

var data=[ [ { "name": "WalkBack", "frameRate": 15 }, { "name": "WalkFront", "frameRate": 15 }, { "name": "WalkLeft", "frameRate": 15 }, { "name": "WalkRight", "frameRate": 15 }, { "name": "Laughing", "frameRate": 15 }, { "name": "Megaphone", "frameRate": 15 }, { "name": "Yawning", "frameRate": 15 } ], [ { "name": "WalkBack", "frameRate": 15 }, { "name": "WalkFront", "frameRate": 15 }, { "name": "WalkLeft", "frameRate": 15 }, { "name": "WalkRight", "frameRate": 15 } ]];

var result2 =  Object.entries(data.flat().reduce((acc, {name})=>{
   acc[name] = [...(acc[name] || []),{name}];
   return acc;
},{})).filter(([k,v])=>v.length>1).map(([name])=>({name}));

console.log(result2);

Upvotes: 1

djcaesar9114
djcaesar9114

Reputation: 2137

First you gather all the "names", then you filter the duplicates :)

var arrays = [
  [
          {
            "name": "WalkBack",
            "frameRate": 15
          },
          {
            "name": "WalkFront",
            "frameRate": 15
          },
          {
            "name": "WalkLeft",
            "frameRate": 15
          },
          {
            "name": "WalkRight",
            "frameRate": 15
          },
          {
            "name": "Laughing",
            "frameRate": 15
          },
          {
            "name": "Megaphone",
            "frameRate": 15
          },
          {
            "name": "Yawning",
            "frameRate": 15
          }
        ],
        [
          {
            "name": "WalkBack",
            "frameRate": 15
          },
          {
            "name": "WalkFront",
            "frameRate": 15
          },
          {
            "name": "WalkLeft",
            "frameRate": 15
          },
          {
            "name": "WalkRight",
            "frameRate": 15
          }
        ]
]

var names = []
arrays.forEach(function(array) {
  array.forEach(function(item) {
    names.push(item.name)
  })
})

var result = []
names.filter( (x,i,a) => a.slice(0,i).find(y=>y==x)  ).forEach(x=>result.push({name: x}))
console.log(result)

Upvotes: 0

Related Questions