我有一个列表,可以有以下几种值:
[
{ "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;
}, []);
}
对于案例 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());
}