# 测试内容
对数组中的数据进行过滤:
- 声明一个声明,返回 list 中的项,并且去掉重复项
- 声明一个变量,返回 list 中的重复项
- 声明一个变量,返回 arr1 和 arr2 中重复的项
# 题目详解
TIP
不使用字符串化存储,而改成相应的映射存储。但这种做法只限用于,每个数组元素只有两个键值对,且键名的位置都相同(当然如果不同,可以先做sort排序处理)。随后通过 记忆对象中的值映射 作为对比源,与数组元素中的age对比,判断是否推进重复项/非重复项。
题解 1:
/**
* 声明一个变量,返回list中的项,并且去掉重复项
*/
let list = [
{ name: "aaa", age: 13 },
{ name: "bbb", age: 15 },
{ name: "ccc", age: 17 },
{ name: "ddd", age: 22 },
{ name: "bbb", age: 15 },
{ name: "aaa", age: 13 },
{ name: "bbb", age: 16 },
];
// 单次遍历,返回无重复项数组
const getUniqueArr = (arr) => {
let memorize = {}; // 记忆对象
return arr.reduce((pre, cur) => {
/**
* cur.name是否存在于记忆对象中。若不存在,将cur的值作为映射赋予记忆对象,并推入pre中
* 若存在,则对比记忆对象中的值与cur.age相等情况,若不等,则表示非重复项,推入。
*/
cur.name in memorize
? cur.age != memorize[cur.name] && pre.push(cur)
: (memorize[cur.name] = cur.age) && pre.push(cur);
return pre;
}, []);
};
console.log(getUniqueArr(list));
// [
// { name: 'aaa', age: 13 },
// { name: 'bbb', age: 15 },
// { name: 'ccc', age: 17 },
// { name: 'ddd', age: 22 },
// { name: 'bbb', age: 16 },
// ]
题解 2:
/**
* 声明一个变量,返回list中的重复项
*/
let list = [
{ name: "aaa", age: 13 },
{ name: "bbb", age: 15 },
{ name: "ccc", age: 17 },
{ name: "ddd", age: 22 },
{ name: "bbb", age: 15 },
{ name: "aaa", age: 13 },
{ name: "bbb", age: 16 },
];
// 单次遍历,返回重复项
const getMoreArr = (arr) => {
let memorize = {}; // 记忆对象
arr.reduce((pre, cur, index) => {
console.log(pre);
if (index == 0) {
memorize[cur.name] = cur.age;
return pre;
}
cur.name in memorize
? memorize[cur.name] == cur.age && pre.push(cur)
: (memorize[cur.name] = cur.age);
return pre;
}, []);
};
console.log(getMoreArr(list)); // [ { name: 'aaa', age: 13 }, { name: 'bbb', age: 15 } ]
题解 3:
/**
* 声明一个变量,返回arr1和arr2中重复的项
*/
let arr1 = [
{ name: "aaa", age: 13 },
{ name: "bbb", age: 15 },
{ name: "ccc", age: 17 },
{ name: "ddd", age: 22 },
{ name: "bbb", age: 15 },
{ name: "aaa", age: 13 },
{ name: "bbb", age: 16 },
];
let arr2 = [
{ name: "aaa", age: 13 },
{ name: "bbb", age: 15 },
{ name: "ccc", age: 17 },
{ name: "ddd", age: 22 },
{ name: "bbb", age: 15 },
{ name: "aaa", age: 13 },
{ name: "bbb", age: 16 },
];
// 单次遍历,返回重复项
const getMoreArr = (arr) => {
let memorize = {}; // 记忆对象
arr.reduce((pre, cur, index) => {
console.log(pre);
if (index == 0) {
memorize[cur.name] = cur.age;
return pre;
}
cur.name in memorize
? memorize[cur.name] == cur.age && pre.push(cur)
: (memorize[cur.name] = cur.age);
return pre;
}, []);
};
console.log(getMoreArr(arr1).concat(getMoreArr(arr2)));
// [
// { name: 'aaa', age: 13 },
// { name: 'bbb', age: 15 },
// { name: 'aaa', age: 13 },
// { name: 'bbb', age: 15 }
// ]
← 如何处理若干if..else 样式修改 →