我有一个对象数组,如下所示:
var data = [
{
name: "block",
sameid: 500,
parentid: 62
},
{
name: "circle",
sameid: 500,
parentid: 62
},
{
name: "cube",
sameid: 500,
parentid: 62
}
]
我需要对该数组进行过滤,以删除 sameid 和 parentid 相同的对象。 但这是一个困扰我的麻烦...... 如果我得到这个对象数组:
var data = [
{
name: "block",
sameid: 500,
parentid: 62
},
{
name: "circle",
sameid: 500,
parentid: 62
},
{
name: "cube",
sameid: 500,
parentid: 62
},
{
name: "grain",
sameid: 500,
parentid: 63
}
]
您可以看到名称 grain (最后一个)的对象,它有不同的parentid。如果是这种情况,则不应删除任何内容。
我正在打破这个问题。 我必须考虑的第一个标准是同一个。我应该按它分组。然后以某种方式检查父ID。
该数组可以包含许多不同的sameid和parentid的
更新: 在第一种情况下,数据有三个对象。所有人都应该被删除,因为他们都有相同的同一性和贫困性。
在第二种情况下,数据有四个对象,所有四个都应该保留,因为有一个不同的对象具有不同的parentid。
更新期望的结果:
var filteredObjects = [];
data = [
{
name: "block",
sameid: 500,
parentid: 62
},
{
name: "circle",
sameid: 500,
parentid: 62
},
{
name: "cube",
sameid: 500,
parentid: 62
},
{
name: "grain",
sameid: 500,
parentid: 63
}
]
在这种情况下,filteredObject将拥有所有值,因为有一个不同的parentid:
filteredObjects [{
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 filteredObjects = [];
data = [
{
name: "block",
sameid: 500,
parentid: 62
},
{
name: "circle",
sameid: 500,
parentid: 62
},
{
name: "cube",
sameid: 500,
parentid: 62
}
]
filteredObject将没有值。数据数组也可以包含不同的sameid。
答案 0 :(得分:3)
您可以使用sameid
和parentid
构建树。然后过滤项目,只返回有两个或更多parenid
的人。
function filter(array) {
var hash = {};
array.forEach(function (a) {
hash[a.sameid] = hash[a.sameid] || {};
hash[a.sameid][a.parentid] = true;
});
return array.filter(function (a) {
return Object.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; }
答案 1 :(得分:2)
您可以使用ES2015的Set
结构来确定您是否有多种类型:
const parentIdSet = new Set(data.map(item => item.parentid));
console.log(parentIdSet.size);
// If 1, you only have one parentId in the entire dataset.
Set是唯一值的集合。通过将所有父ID放入Set中,将删除所有重复值,并且只剩下唯一值。如果Set的大小为1,则表示整个数据集中只有一个parentid。
使用set意味着您可以避免将初始值存储在某处并尝试进行比较。 Set自动为您完成,并且具有更好的性能(可能)
答案 2 :(得分:2)
您可以简单地遍历初始数组并在检查唯一性的同时构建一个新数组
可以使用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])
return false;
return (set[key] = true);
});
console.log(newData);

请注意,此算法会使用相同ID的每次出现。如果需要,您可以实现其他逻辑。
答案 3 :(得分:0)
你可以试试这个
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)
}
}
答案 4 :(得分:0)
我试图解决您的问题,您需要为以下代码添加下划线。
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++;
}
else if((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")
答案 5 :(得分:0)
你也可以研究这种方法:
data.reduce(function(p, c, index){
if (p.length !== index) return [];
if (p.length === 0) {
return p.concat(c);
}
else if (p[0].sameid === c.sameid && p[0].parentid === c.parentid){
return p.concat(c);
}
return [];
}, []);