基于两个属性从数组中删除对象

问题描述 投票:0回答:2

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

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

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

理想情况下,我想使用Array.filter但尚未弄清楚如何基于两个属性来做到这一点。另外,我仅限于es5。

javascript arrays ecmascript-5
2个回答
2
投票

创建另一个包含要测试的属性组合的对象。使用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;
});

0
投票

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)
© www.soinside.com 2019 - 2024. All rights reserved.