根据两个属性从数组中删除对象

Removing objects from array based on two properties

我有一个数组,其中包含如下所示的自定义对象:

{
    field: fieldName,
    dataType: usuallyAString,
    title: titleForLocalization,
    environmentLabel: environmentName
}

对象还有一些其他属性,但我真正关心的只有 fieldenvironmentLabel。我需要过滤掉任何具有相同 fieldenvironmentLabel 但不关心任何其他属性的对象。该数组可以包含共享 fieldenvironmentLabel 的对象,但不能同时包含两者。

理想情况下,我想使用 Array.filter,但尚未根据两个属性弄清楚如何使用它。另外,我仅限于 es5。

创建另一个包含您要测试的所有属性组合的对象。使用 filter() 并测试该对是否已存在于对象中。如果没有,将属性添加到另一个对象和 return 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)