Filtering An Array Of Objects - Several Criteria
Solution 1:
You could build a tree with sameid
and parentid
. Then filter the items and return only the one who have two or more parenid
.
functionfilter(array) {
var hash = {};
array.forEach(function (a) {
hash[a.sameid] = hash[a.sameid] || {};
hash[a.sameid][a.parentid] = true;
});
return array.filter(function (a) {
returnObject.keys(hash[a.sameid]).length > 1;
});
}
var data0 = [{ name: "block", sameid: 500, parentid: 62 }],
data1 = [{ name: "block", sameid: 500, parentid: 62 }, { name: "circle", sameid: 500, parentid: 62 }, { name: "cube", sameid: 500, parentid: 62 }],
data2 = [{ name: "block", sameid: 500, parentid: 62 }, { name: "circle", sameid: 500, parentid: 62 }, { name: "cube", sameid: 500, parentid: 62 }, { name: "grain", sameid: 500, parentid: 63 }],
data3 = [{ name: "block", sameid: 500, parentid: 62 }, { name: "circle", sameid: 500, parentid: 62 }, { name: "cube", sameid: 500, parentid: 62 }, { name: "grain", sameid: 500, parentid: 63 }, { name: "library", sameid: 600, parentid: 66 }, { name: "wood", sameid: 600, parentid: 66 }, { name: "water", sameid: 700, parentid: 77 }, { name: "fire", sameid: 700, parentid: 78 }, { name: "orphan", sameid: 300, parentid: 12 }];
console.log(filter(data0));
console.log(filter(data1));
console.log(filter(data2));
console.log(filter(data3));
.as-console-wrapper { max-height: 100%!important; top: 0; }
Solution 2:
You can use ES2015's Set
structure to find out whether or not you have more than one kind:
const parentIdSet = newSet(data.map(item => item.parentid));
console.log(parentIdSet.size);
// If 1, you only have one parentId in the entire dataset.
A Set is a collection of unique values. By putting all of the parent IDs into a Set, all of the duplicate values are removed, and you have only unique values left. If the size of the Set is 1, it means that you only have one parentid in the entire dataset.
Using a set means you can avoid having to store the initial values somewhere and try to compare. The Set does it for you automatically, and with better performance (probably)
Solution 3:
You can simply iterate through your initial array and build a new one while checking the uniqueness.
It can be done by utilizing Array.prototype.filter
:
var data = [
{
name: "same sameid and parentid",
sameid: 500,
parentid: 62
},
{
name: "same sameid and parentid",
sameid: 500,
parentid: 62
},
{
name: "different sameid, same parentid",
sameid: 501,
parentid: 62
},
,
{
name: "same sameid, different parentid",
sameid: 500,
parentid: 63
}
];
var set = {};
var newData = data.filter(function(x) {
var key = x.sameid + "_" + x.parentid;
if (set[key])
returnfalse;
return (set[key] = true);
});
console.log(newData);
Note that this algorithm takes every first occurence of same IDs. You can implement another logics, if you need.
Solution 4:
you can try this
var distincts = []
for (var i = 0; i < data.length; i++)
if (distincts.indexOf(data[i].sameid)==-1)
distincts.push(data[i].sameid);
if(distincts.length==1){
var distinctp = []
for (var i = 0; i < data.length; i++)
if (distinctp.indexOf(data[i].sameid)==-1)
distinctp.push(data[i].sameid);
if(distincts.length==1){
data.splice(0,data.length)
}
}
Solution 5:
i have tried to solve your question , you need to add underscorejs for the following code.
var data2 = [
{
name: "block",
sameid: 500,
parentid: 62
},
{
name: "circle",
sameid: 500,
parentid: 62
},
{
name: "cube",
sameid: 500,
parentid: 62
},
{
name: "grain",
sameid: 500,
parentid: 63
}
]
var backup = data2;
var count1 = 0;
var count2 = 0;
for(var i = 0; i< data2.length ;i ++){
for(var j = i+1;j<data2.length ;j++){
if(data2[i].sameid == data2[j].sameid && data2[i].parentid == data2[j].parentid){
count1++;
}
elseif((data2[i].sameid == data2[j].sameid && data2[i].parentid != data2[j].parentid) ||(data2[i].sameid != data2[j].sameid && data2[i].parentid == data2[j].parentid) ){
count2++;
}
}
if(count2 == 0 && count1 != 0){
backup = _.reject(backup,function(d){return d.sameid == data2[i].sameid && d.parentid == data2[i].parentid })
}
count2=0;count1=0;
}
console.log(backup,"my new array")
Post a Comment for "Filtering An Array Of Objects - Several Criteria"