如何迭代数组的数组来过滤掉或拒绝重复的条目?



我想遍历这个二维数组。具有多个对象的数组在同一个月份有多个条目(在下面的示例中为一月份)。我想过滤掉(拒绝)重复的条目,并返回修改后的数组。

我在这里尝试了不同的解决方案,但到目前为止失败了;我将感谢任何输入!

[[
{ "id":"9","bookingReason":"Netto Neu Eigen","bookingDate":"2021-01-22","bookingType":"Gutschrift","bookingPoints":"100" },
{ "id":"10","bookingReason":"Netto Neu Eigen","bookingDate":"2021-01-23","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"9","bookingReason":"Netto Neu Eigen","bookingDate":"2021-01-22","bookingType":"Gutschrift","bookingPoints":"100" },
{ "id":"10","bookingReason":"Netto Neu Eigen","bookingDate":"2021-01-23","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"29","bookingReason":"Netto Neu Eigen","bookingDate":"2022-01-22","bookingType":"Gutschrift","bookingPoints":"100" },
{ "id":"30","bookingReason":"Netto Neu Eigen","bookingDate":"2022-01-23","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"29","bookingReason":"Netto Neu Eigen","bookingDate":"2022-01-22","bookingType":"Gutschrift","bookingPoints":"100" },
{ "id":"30","bookingReason":"Netto Neu Eigen","bookingDate":"2022-01-23","bookingType":"Gutschrift","bookingPoints":"100" }
]]

编辑对跟踪器的回答:我想最小值应该是检查每个子数组是否唯一。因此,如果过滤器第二次发现相同的id,则应该删除整个重复数组。

编辑Peter Seliger的回答:结果应保持二维结构。

[
[{
"id": "1",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2021-09-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}], [{
"id": "2",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2021-08-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}], [{
"id": "3",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2021-07-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}], [{
"id": "4",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2021-06-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}], [{
"id": "5",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2021-05-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}], [{
"id": "6",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2021-04-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}], [{
"id": "7",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2021-03-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}, {
"id": "12",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2021-03-24",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}], [{
"id": "8",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2021-02-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}, {
"id": "11",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2021-02-23",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}], [{
"id": "9",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2021-01-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}, {
"id": "10",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2021-01-23",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}], [{
"id": "9",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2021-01-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}, {
"id": "10",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2021-01-23",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}], [{
"id": "8",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2021-02-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}, {
"id": "11",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2021-02-23",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}], [{
"id": "7",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2021-03-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}, {
"id": "12",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2021-03-24",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}], [{
"id": "21",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2022-09-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}], [{
"id": "22",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2022-08-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}], [{
"id": "23",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2022-07-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}], [{
"id": "24",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2022-06-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}], [{
"id": "25",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2022-05-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}], [{
"id": "26",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2022-04-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}], [{
"id": "27",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2022-03-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}, {
"id": "32",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2022-03-24",
"bookingType": "Gutschrift",
"bookingPoints": "200"
}], [{
"id": "28",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2022-02-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}, {
"id": "31",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2022-02-23",
"bookingType": "Gutschrift",
"bookingPoints": "400"
}], [{
"id": "29",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2022-01-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}, {
"id": "30",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2022-01-23",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}], [{
"id": "29",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2022-01-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}, {
"id": "30",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2022-01-23",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}], [{
"id": "28",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2022-02-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}, {
"id": "31",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2022-02-23",
"bookingType": "Gutschrift",
"bookingPoints": "400"
}], [{
"id": "27",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2022-03-22",
"bookingType": "Gutschrift",
"bookingPoints": "100"
}, {
"id": "32",
"bookingReason": "Netto Neu Eigen",
"bookingDate": "2022-03-24",
"bookingType": "Gutschrift",
"bookingPoints": "200"
}]
]

OP的实际意思是…

"我想过滤掉双条目,并希望返回过滤后的数组。">

…OP想要直接改变所提供的数据结构,或者可能是它的结构化克隆。

"因此,如果过滤器第二次发现相同的id,则应该删除整个重复数组。">

"编辑回答Peter Seliger:结果应该保持二维结构。">

因此必须提出递归工作的拒绝荷兰国际集团(ing)

方法。提供的实现使用查找特定于自定义键(属性名)的值。如果值还不存在,则继续迭代,但将值赋值给查找。任何具有相同的、已经赋值的数组项从数组(这是一个突变任务)中获得spliceed,并被推入本地rejected数组。函数的返回值是一个包含两个数组的对象…mutated是传递和处理/突变的数据结构的引用,rejected是从提供的数据结构中被拒绝的项目的扁平列表。

function rejecItemsOfSameKeyAndValueRecursively(
arr = [], key = '', lookup = new Map,
) {
const rejected = [];
for (let idx = 0; idx < arr.length; idx++) {
const item = arr[idx];
if (Array.isArray(item)) {
// recursion in order to handle nested array structures.
rejected
.push(
...rejecItemsOfSameKeyAndValueRecursively(item, key, lookup).rejected
);
// ... and in case one wants to also get rid
//     of the now possibly empty array item ...
if (item.length === 0) {
// remove empty array item.
arr.splice(idx, 1);
// re/adjust the proceeding index value.
--idx; 
}
} else if (!!item && typeof item === 'object') {
const value = item[key];
if (lookup.has(value)) {
rejected
.push(
// remove duplicate item from array.
arr.splice(idx, 1)
);
--idx; // re/adjust the proceeding index value.
} else {
lookup.set(value, value);
}
}
}
return { mutated: arr, rejected };
}
const sampleData = [[
{ "id":"1","bookingReason":"Netto Neu Eigen","bookingDate":"2021-09-22","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"2","bookingReason":"Netto Neu Eigen","bookingDate":"2021-08-22","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"3","bookingReason":"Netto Neu Eigen","bookingDate":"2021-07-22","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"4","bookingReason":"Netto Neu Eigen","bookingDate":"2021-06-22","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"5","bookingReason":"Netto Neu Eigen","bookingDate":"2021-05-22","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"6","bookingReason":"Netto Neu Eigen","bookingDate":"2021-04-22","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"7","bookingReason":"Netto Neu Eigen","bookingDate":"2021-03-22","bookingType":"Gutschrift","bookingPoints":"100" },
{ "id":"12","bookingReason":"Netto Neu Eigen","bookingDate":"2021-03-24","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"8","bookingReason":"Netto Neu Eigen","bookingDate":"2021-02-22","bookingType":"Gutschrift","bookingPoints":"100" },
{ "id":"11","bookingReason":"Netto Neu Eigen","bookingDate":"2021-02-23","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"9","bookingReason":"Netto Neu Eigen","bookingDate":"2021-01-22","bookingType":"Gutschrift","bookingPoints":"100" },
{ "id":"10","bookingReason":"Netto Neu Eigen","bookingDate":"2021-01-23","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"9","bookingReason":"Netto Neu Eigen","bookingDate":"2021-01-22","bookingType":"Gutschrift","bookingPoints":"100" },
{ "id":"10","bookingReason":"Netto Neu Eigen","bookingDate":"2021-01-23","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"8","bookingReason":"Netto Neu Eigen","bookingDate":"2021-02-22","bookingType":"Gutschrift","bookingPoints":"100" },
{ "id":"11","bookingReason":"Netto Neu Eigen","bookingDate":"2021-02-23","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"7","bookingReason":"Netto Neu Eigen","bookingDate":"2021-03-22","bookingType":"Gutschrift","bookingPoints":"100" },
{ "id":"12","bookingReason":"Netto Neu Eigen","bookingDate":"2021-03-24","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"21","bookingReason":"Netto Neu Eigen","bookingDate":"2022-09-22","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"22","bookingReason":"Netto Neu Eigen","bookingDate":"2022-08-22","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"23","bookingReason":"Netto Neu Eigen","bookingDate":"2022-07-22","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"24","bookingReason":"Netto Neu Eigen","bookingDate":"2022-06-22","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"25","bookingReason":"Netto Neu Eigen","bookingDate":"2022-05-22","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"26","bookingReason":"Netto Neu Eigen","bookingDate":"2022-04-22","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"27","bookingReason":"Netto Neu Eigen","bookingDate":"2022-03-22","bookingType":"Gutschrift","bookingPoints":"100" },
{ "id":"32","bookingReason":"Netto Neu Eigen","bookingDate":"2022-03-24","bookingType":"Gutschrift","bookingPoints":"200" }
], [
{ "id":"28","bookingReason":"Netto Neu Eigen","bookingDate":"2022-02-22","bookingType":"Gutschrift","bookingPoints":"100" },
{ "id":"31","bookingReason":"Netto Neu Eigen","bookingDate":"2022-02-23","bookingType":"Gutschrift","bookingPoints":"400" }
], [
{ "id":"29","bookingReason":"Netto Neu Eigen","bookingDate":"2022-01-22","bookingType":"Gutschrift","bookingPoints":"100" },
{ "id":"30","bookingReason":"Netto Neu Eigen","bookingDate":"2022-01-23","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"29","bookingReason":"Netto Neu Eigen","bookingDate":"2022-01-22","bookingType":"Gutschrift","bookingPoints":"100" },
{ "id":"30","bookingReason":"Netto Neu Eigen","bookingDate":"2022-01-23","bookingType":"Gutschrift","bookingPoints":"100" }
], [
{ "id":"28","bookingReason":"Netto Neu Eigen","bookingDate":"2022-02-22","bookingType":"Gutschrift","bookingPoints":"100" },
{ "id":"31","bookingReason":"Netto Neu Eigen","bookingDate":"2022-02-23","bookingType":"Gutschrift","bookingPoints":"400" }
], [
{ "id":"27","bookingReason":"Netto Neu Eigen","bookingDate":"2022-03-22","bookingType":"Gutschrift","bookingPoints":"100" },
{ "id":"32","bookingReason":"Netto Neu Eigen","bookingDate":"2022-03-24","bookingType":"Gutschrift","bookingPoints":"200" }
]];
const cloneDataStructure = (typeof structuredClone === 'function')
? structuredClone
: value => JSON.parse(JSON.stringify(value));

const data = cloneDataStructure(sampleData);
const { mutated, rejected } = rejecItemsOfSameKeyAndValueRecursively(data, 'id');
console.log(
'... mutated/rejected by `id` ... ',
);
console.log(
'(mutated === data) ?..',
(mutated === data),
);
console.log(
{ mutated, rejected },
);

const data_2 = cloneDataStructure(sampleData);
const { mutated: mutated_2, rejected: rejected_2 } =
rejecItemsOfSameKeyAndValueRecursively(cloneDataStructure(data_2), 'bookingPoints');
console.log(
'... mutated/rejected by `bookingPoints` ... ',
);
console.log(
'(mutated_2 === data_2) ?..',
(mutated_2 === data_2),
);
console.log(
{ mutated_2, rejected_2 },
);
.as-console-wrapper { min-height: 100%!important; top: 0; }

我不确定我是否正确地阅读了这个问题,但如果你需要做的就是把这个粗糙的二维数组和从任何嵌套数组中过滤掉重复的条目,那么我认为这很简单:

const dedupe = (
data, found = new Set(), result,
test = (x) => ((result = ! found .has (x .id)), (found .add (x .id)), result)
) => data .map ((group) => group .filter (test)) .filter (x => x .length > 0)

const data = [[{id: "1", bookingReason: "Netto Neu Eigen", bookingDate: "2021-09-22", bookingType: "Gutschrift", bookingPoints: "100"}], [{id: "2", bookingReason: "Netto Neu Eigen", bookingDate: "2021-08-22", bookingType: "Gutschrift", bookingPoints: "100"}], [{id: "3", bookingReason: "Netto Neu Eigen", bookingDate: "2021-07-22", bookingType: "Gutschrift", bookingPoints: "100"}], [{id: "4", bookingReason: "Netto Neu Eigen", bookingDate: "2021-06-22", bookingType: "Gutschrift", bookingPoints: "100"}], [{id: "5", bookingReason: "Netto Neu Eigen", bookingDate: "2021-05-22", bookingType: "Gutschrift", bookingPoints: "100"}], [{id: "6", bookingReason: "Netto Neu Eigen", bookingDate: "2021-04-22", bookingType: "Gutschrift", bookingPoints: "100"}], [{id: "7", bookingReason: "Netto Neu Eigen", bookingDate: "2021-03-22", bookingType: "Gutschrift", bookingPoints: "100"}, {id: "12", bookingReason: "Netto Neu Eigen", bookingDate: "2021-03-24", bookingType: "Gutschrift", bookingPoints: "100"}], [{id: "8", bookingReason: "Netto Neu Eigen", bookingDate: "2021-02-22", bookingType: "Gutschrift", bookingPoints: "100"}, {id: "11", bookingReason: "Netto Neu Eigen", bookingDate: "2021-02-23", bookingType: "Gutschrift", bookingPoints: "100"}], [{id: "9", bookingReason: "Netto Neu Eigen", bookingDate: "2021-01-22", bookingType: "Gutschrift", bookingPoints: "100"}, {id: "10", bookingReason: "Netto Neu Eigen", bookingDate: "2021-01-23", bookingType: "Gutschrift", bookingPoints: "100"}], [{id: "9", bookingReason: "Netto Neu Eigen", bookingDate: "2021-01-22", bookingType: "Gutschrift", bookingPoints: "100"}, {id: "10", bookingReason: "Netto Neu Eigen", bookingDate: "2021-01-23", bookingType: "Gutschrift", bookingPoints: "100"}], [{id: "8", bookingReason: "Netto Neu Eigen", bookingDate: "2021-02-22", bookingType: "Gutschrift", bookingPoints: "100"}, {id: "11", bookingReason: "Netto Neu Eigen", bookingDate: "2021-02-23", bookingType: "Gutschrift", bookingPoints: "100"}], [{id: "7", bookingReason: "Netto Neu Eigen", bookingDate: "2021-03-22", bookingType: "Gutschrift", bookingPoints: "100"}, {id: "12", bookingReason: "Netto Neu Eigen", bookingDate: "2021-03-24", bookingType: "Gutschrift", bookingPoints: "100"}], [{id: "21", bookingReason: "Netto Neu Eigen", bookingDate: "2022-09-22", bookingType: "Gutschrift", bookingPoints: "100"}], [{id: "22", bookingReason: "Netto Neu Eigen", bookingDate: "2022-08-22", bookingType: "Gutschrift", bookingPoints: "100"}], [{id: "23", bookingReason: "Netto Neu Eigen", bookingDate: "2022-07-22", bookingType: "Gutschrift", bookingPoints: "100"}], [{id: "24", bookingReason: "Netto Neu Eigen", bookingDate: "2022-06-22", bookingType: "Gutschrift", bookingPoints: "100"}], [{id: "25", bookingReason: "Netto Neu Eigen", bookingDate: "2022-05-22", bookingType: "Gutschrift", bookingPoints: "100"}], [{id: "26", bookingReason: "Netto Neu Eigen", bookingDate: "2022-04-22", bookingType: "Gutschrift", bookingPoints: "100"}], [{id: "27", bookingReason: "Netto Neu Eigen", bookingDate: "2022-03-22", bookingType: "Gutschrift", bookingPoints: "100"}, {id: "32", bookingReason: "Netto Neu Eigen", bookingDate: "2022-03-24", bookingType: "Gutschrift", bookingPoints: "200"}], [{id: "28", bookingReason: "Netto Neu Eigen", bookingDate: "2022-02-22", bookingType: "Gutschrift", bookingPoints: "100"}, {id: "31", bookingReason: "Netto Neu Eigen", bookingDate: "2022-02-23", bookingType: "Gutschrift", bookingPoints: "400"}], [{id: "29", bookingReason: "Netto Neu Eigen", bookingDate: "2022-01-22", bookingType: "Gutschrift", bookingPoints: "100"}, {id: "30", bookingReason: "Netto Neu Eigen", bookingDate: "2022-01-23", bookingType: "Gutschrift", bookingPoints: "100"}], [{id: "29", bookingReason: "Netto Neu Eigen", bookingDate: "2022-01-22", bookingType: "Gutschrift", bookingPoints: "100"}, {id: "30", bookingReason: "Netto Neu Eigen", bookingDate: "2022-01-23", bookingType: "Gutschrift", bookingPoints: "100"}], [{id: "28", bookingReason: "Netto Neu Eigen", bookingDate: "2022-02-22", bookingType: "Gutschrift", bookingPoints: "100"}, {id: "31", bookingReason: "Netto Neu Eigen", bookingDate: "2022-02-23", bookingType: "Gutschrift", bookingPoints: "400"}], [{id: "27", bookingReason: "Netto Neu Eigen", bookingDate: "2022-03-22", bookingType: "Gutschrift", bookingPoints: "100"}, {id: "32", bookingReason: "Netto Neu Eigen", bookingDate: "2022-03-24", bookingType: "Gutschrift", bookingPoints: "200"}]]
console .log (dedupe (data))
.as-console-wrapper {max-height: 100% !important; top: 0}

我们写了一些我通常试图避免的东西:一个有状态函数关闭了一个可变的id集合,我们已经看到了。这个函数被用作对嵌套数组进行filter调用的回调。我倾向于避免有状态函数,但另一种选择似乎很复杂,即嵌套折叠,这种方法效果很好。

我假设我们不希望在删除任何基本重复项后留下空组。如果这个假设是错误的,我们可以简单地删除最后的filter调用。

那个版本语法紧凑。下面的变体可能对某些人更有吸引力:

const dedupe = (data) => {
const found = new Set()
const test = (x) => {
const result = ! found .has (x .id)
found .add (x .id)
return result
}
return data .map ((group) => group .filter (test)) 
.filter (x => x .length > 0)
}

它们做同样的事情。

最新更新