Reputation: 3082
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
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
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
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
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