我有一个包含自定义对象的数组,如下所示:
{
field: fieldName,
dataType: usuallyAString,
title: titleForLocalization,
environmentLabel: environmentName
}
该对象还有其他一些属性,但我唯一关心的是field
和environmentLabel
。我需要过滤掉任何具有相同field
和environmentLabel
的对象,但不关心任何其他属性。该数组可以包含共享field
或environmentLabel
的对象,而不是两者。
理想情况下,我想使用Array.filter
但尚未弄清楚如何基于两个属性来做到这一点。另外,我仅限于es5。
创建另一个包含要测试的属性组合的对象。使用filter()
并测试该对是否已存在于对象中。如果没有,请将属性添加到另一个对象并返回true
。
var seen = {};
newArray = array.filter(function(obj) {
if (seen[obj.field]) {
if (seen[obj.field].includes(obj.environmentLabel) {
return false;
} else {
seen[obj.field].push(obj.environmentLabel);
}
} else {
seen[obj.field] = [obj.environmentLabel];
}
return true;
});
const data = [{
field: 1,
dataType: "usuallyAString",
title: "titleForLocalization",
environmentLabel: 1
},
{
field: 1,
dataType: "usuallyAString",
title: "titleForLocalization",
environmentLabel: 1
},
{
field: 2,
dataType: "usuallyAString",
title: "titleForLocalization",
environmentLabel: 2
}]
var result = _.uniqWith(data, function(arrVal, othVal) {
return arrVal.field=== othVal.field && arrVal.environmentLabel=== othVal.environmentLabel;
});
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
如果你能够使用lodash,你可以这样做:
var result = _.uniqWith(data, function(arrVal, othVal) {
return arrVal.field=== othVal.field && arrVal.environmentLabel=== othVal.environmentLabel;
});
console.log(result)