我有一个对象数组,如下所示:
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。如果是这样,则不应删除任何内容。
我正在为这个而伤脑筋。 我必须考虑的第一个标准是 sameid。我应该把它们分组。然后以某种方式检查父 ID。
数组可以包含很多不同的sameid和parentid
更新: 在第一种情况下,数据具有三个对象。所有的都应该被删除,因为它们都有相同的 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。
最佳答案
您可以使用 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; }
关于javascript - 过滤对象数组 - 几个条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39140297/