在日常开发中,我们经常会遇到需要去重json数组中重复的数据的场景。json数组去重有很多种方法,比如:双重for循环去重、利用对象属性名不冲突去重,今天我们介绍几个json数组去重的方法。希望能够帮助到大家。
让我们来看看chatgpt跟进封装的函数写出的具体实现思路吧,大家看看是否逻辑清晰,是否一目了然。
方法一 reduce
实现思路
- 判断传入的jsonArr是否符合去重的条件,即长度大于等于2,指定了去重字段,且第一个元素是JSON格式数据;
- 如果不符合条件,则直接返回原始数组jsonArr;
- 如果符合条件,则利用reduce方法遍历jsonArr,对每个元素进行处理,将其与all中的元素进行比较,如果有元素的指定去重字段与next相同,则返回all,否则将next加入到all中;
- 返回去重后的数组uniqueArr。
```
/*- json数组去重
- @param: {Array} jsonArr 去重之前的数组
- @param {String} field 需要去重的字段值
- @return {Array} 去重之后的数组
*/
export function uniqueJsonArrByField(jsonArr, field) {
// 数组长度小于2 或 没有指定去重字段 或 不是json格式数据
if (jsonArr.length < 2 || !field || typeof jsonArr[0] !== "object") return jsonArr;
const uniqueArr = jsonArr.reduce((all, next) => all.some((item) => item[field] == next[field]) ? all : [...all, next], []);
return uniqueArr;
}
# 方法二 filter和Map
## 实现思路
1. 判断传入的 jsonArr 是否符合去重的条件,即长度大于等于2,指定了去重字段,且第一个元素是 JSON 格式数据;
2. 如果不符合条件,则直接返回原始数组 jsonArr;
3. 如果符合条件,则创建一个空的 Map 对象 res;
4. 利用数组的 filter() 方法遍历 jsonArr 数组,对每个元素进行处理:
- 判断当前元素的指定去重字段值是否已经存在于 res 中,如果已经存在,则说明该元素重复,直接过滤掉;
- 如果该元素的指定去重字段值不存在于 res 中,则将其加入到 res 中,并返回 true;
5.将过滤后的数组作为返回值返回。
```js
/**
* json数组去重
* @param {Array} jsonArr 去重之前的数组
* @param {String} field 需要去重的字段值
* @return {Array} 去重之后的数组
*/
export function uniqueJsonArrByField(jsonArr, field) {
// 数组长度小于2 或 没有指定去重字段 或 不是json格式数据
if (jsonArr.length < 2 || !field || typeof jsonArr[0] !== "object") return jsonArr;
const res = new Map(); // 标识对象
const uniqueArr = jsonArr.filter((item) => !res.has(item[field]) && res.set(item[field], true));
return uniqueArr;
}
方法三 变异for
实现思路
- 判断传入的 jsonArr 是否符合去重的条件,即长度大于等于2,指定了去重字段,且第一个元素是 JSON 格式数据;
- 如果不符合条件,则直接返回原始数组 jsonArr;
- 如果符合条件,则创建一个空对象 obj;
- 创建一个空数组 uniqueArr;
- 利用 for 循环遍历 jsonArr 数组,对每个元素进行处理:
- 判断当前元素的指定去重字段值是否已经存在于 obj 中,如果已经存在,则说明该元素重复,直接跳过;
- 如果该元素的指定去重字段值不存在于 obj 中,则将其加入到 uniqueArr 中,并在 obj 中记录该值;
- 将去重后的数组作为返回值返回。
/** * json数组去重 * @param {Array} jsonArr 去重之前的数组 * @param {String} field 需要去重的字段值 * @return {Array} 去重之后的数组 */ export function uniqueJsonArrByField(jsonArr, field) { // 数组长度小于2 或 没有指定去重字段 或 不是json格式数据 if (jsonArr.length < 2 || !field || typeof jsonArr[0] !== "object") return jsonArr; let obj = { }; // 标识对象 let uniqueArr = []; for(let i = 0; i<jsonArr.length; i++) { if(!obj[jsonArr[i][field]]){ uniqueArr.push(jsonArr[i]); obj[jsonArr[i][field]] = true; } } return uniqueArr; }
方法四 for + filter
实现思路
- 判断传入的 jsonArr 是否符合去重的条件,即长度大于等于2,指定了去重字段,且第一个元素是 JSON 格式数据;
- 如果不符合条件,则直接返回原始数组 jsonArr;
- 如果符合条件,则创建一个空数组 uniqueArr,并将 jsonArr 中的第一个元素加入到 uniqueArr 中;
- 利用 for 循环遍历 jsonArr 数组,对每个元素进行处理:
- 用 filter() 方法过滤 uniqueArr 中的元素,查找是否存在指定去重字段值与当前元素相同的元素;
- 如果存在,则说明该元素重复,直接跳过;
- 如果不存在,则将该元素加入到 uniqueArr 中;
- 将去重后的数组作为返回值返回。
/** * json数组去重 * @param {Array} jsonArr 去重之前的数组 * @param {String} field 需要去重的字段值 * @return {Array} 去重之后的数组 */ export function uniqueJsonArrByField(jsonArr, field) { // 数组长度小于2 或 没有指定去重字段 或 不是json格式数据 if (jsonArr.length < 2 || !field || typeof jsonArr[0] !== "object") return jsonArr; let uniqueArr = [jsonArr[0]]; for (let i = 1; i < jsonArr.length; i++) { let item = jsonArr[i]; let filterData = uniqueArr.filter(function (f_item) { return item[field] && f_item[field] == item[field]; }); if (filterData.length == 0) { // 如果uniqueArr中不存在item uniqueArr.push(item); } } return uniqueArr; }
方法五 for
实现思路
- 判断传入的 jsonArr 是否符合去重的条件,即长度大于等于2,指定了去重字段,且第一个元素是 JSON 格式数据;
- 如果不符合条件,则直接返回原始数组 jsonArr;
- 如果符合条件,则创建一个空数组 uniqueArr,并将 jsonArr 中的第一个元素加入到 uniqueArr 中;
- 利用 for 循环遍历 jsonArr 数组,对每个元素进行处理:
- 创建一个布尔类型的变量 repeat 作为标识位,初始值为 false;
- 再用一个 for 循环遍历 uniqueArr 数组,对于每个元素都检查它们的指定去重字段值是否与当前元素的指定去重字段值相同;
- 如果存在,则说明该元素重复,将标识位设为 true 并跳出循环;
- 如果不存在,则将该元素加入到 uniqueArr 中;
- 将去重后的数组作为返回值返回。
/*
* json数组去重
* @param: {Array} jsonArr 去重之前的数组
* @param {String} field 需要去重的字段值
* @return {Array} 去重之后的数组
*/
export function uniqueJsonArrByField(jsonArr, field) {
// 数组长度小于2 或 没有指定去重字段 或 不是json格式数据
if (jsonArr.length < 2 || !field || typeof jsonArr[0] !== "object") return jsonArr;
let uniqueArr = [jsonArr[0]];
for (let i = 1; i < jsonArr.length; i++) {
let item = jsonArr[i];
let repeat = false; // 标识位
for (let j = 0; j < uniqueArr.length; j++) {
if (item[field] && item[field] == uniqueArr[j][field]) {
repeat = true;
break;
}
}
if (!repeat) {
uniqueArr.push(item);
}
}
return uniqueArr;
}
大家觉得chatgpt根据函数写出的实现思路准确吗?欢迎留言讨论。