根据同一列表中对象的某些组合从列表中删除对象

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

我有一个列表,可以有以下几种值:

[
  { "a": "ABC", "b": "DEF", "c": "IAABS", "d": "XYZ" },
  { "a": "ABC", "b": "DEF", "c": "*ALL", "d": "*ALL" },
  { "a": "LMN", "b": "BIFPSR", "c": "*ALL", "d": "FGH" },
  { "a": "YUI", "b": "BIFPSR", "c": "TEST", "d": "XYZ" },
  { "a": "LMN", "b": "BIFPSR", "c": "TEST", "d": "FGH" },
]

以下是我想要通过的测试用例:

情况 1:如果超过 1 个对象包含相同的

a
b
作为组合,则检查这些对象中是否有任何对象包含
c
d
作为 *ALL 或不包含。如果是,则移除其他物体。

情况 2:如果超过 1 个对象包含相同的

a
b
作为组合,则检查这些对象中是否有任何对象具有
c
作为 *ALL
d
作为任何值。如果是,则根据
d
的值检查哪些对象对于相同
a
b
作为组合具有相同的值,然后需要删除这些对象。

情况 3:如果上述情况不匹配/列表为空,则应输出。

上述案例的预期输出:

[
  { "a": "ABC", "b": "DEF", "c": "*ALL", "d": "*ALL" },
  { "a": "LMN", "b": "BIFPSR", "c": "*ALL", "d": "FGH" },
  { "a": "YUI", "b": "BIFPSR", "c": "TEST", "d": "XYZ" }
]

对于案例 1,我尝试了下面类似的方法,但它只打印原始数组 -

function abc(arr) {
    const seen = new Set(); // Set to store unique combination
    return arr.reduce((acc, obj) => {
        const key = `${obj.a}-${obj.b}`;
        if (!seen.has(key)) {
            seen.add(key);
            acc.push(obj); // Adding unique elements or objects with *ALL
        } else if (obj.c === '*ALL') {
            acc.push(obj);
        }
        return acc;
    }, []);
}
javascript
1个回答
0
投票

对于案例 1,使用地图来跟踪

a
b
的独特组合。然后,迭代
arr
中的每个对象:如果看不见,则将其添加到地图中,或者如果它具有
c
d
则替换为
*ALL
。最后将地图的值转换为数组并返回。

喜欢:

function abc(arr) {
    const seen = new Map();

    arr.forEach(obj => {
         const key = `${obj.a}-${obj.b}`;
         if (!seen.has(key)) {
             seen.set(key, obj);
         } else if (obj.c === "*ALL" && obj.d === "*ALL") {
             seen.set(key, obj);
         }
    });

    return Array.from(seen.values());
}
© www.soinside.com 2019 - 2024. All rights reserved.