文章目录
场景
table中某一个key不能重复。
方法
使用new Set() 去重后,判断数组和set的长度
/**
* 是否有重复的项:false:没有重复;true:有重复的;
* @param arr
* @param uniKey
*/
const hasDuplicates = (arr, uniKey) => {
// 处理成只有uniKey的数组
const keyArr = arr.map(v => v[uniKey]);
// 使用Set 去重
const keySet = new Set(keyArr);
// Set的长度是size
if (keyArr.length != keySet.size) {
return true; // 有重复的
}
return false; // 没有重复的
};
for循环遍历,用对象存储key
/**
* @param arr 如:var arr = [{name: "123", age : 123}, {name:"1234432", age : 1234324}]
* @param key 如:"name"
*
* @retutns boolean: true:不存在; false:存在重复
**/
function isRepeat(arr, key) {
var obj = {};
for (let i = 0; i < arr.length; i ++) {
if (obj[arr[i][key]]) {
return false; // 存在
} else {
obj[arr[i][key]] = arr[i];
}
}
return true;
}
ladash
const paramList = [
{
"id": "1770635898850369537",
"paramKey": "deviceId",
"paramType": 4,
"paramPosition": 2,
"paramValue": "${query.id}",
},
{
"id": "1770635898850369538",
"paramKey": "deviceCode",
"paramType": 3,
"paramPosition": 5,
"paramValue": "${code}",
},
{
"id": "1770635898854563842",
"paramKey": "deviceSn",
"paramType": 6,
"paramPosition": 5,
"paramValue": "imesi",
},
{
"id": "1770635898854563843",
"paramKey": "deviceId",
"paramType": 6,
"paramPosition": 1,
"paramValue": "test",
}
]
console.log('去重:',_.uniqBy(paramList, 'paramKey')) // 返回list,只有前三个了。
数组对象去重
首先我们定义数组的形式
let arrObj = [
{ name: "张三", key: '1' },
{ name: "李四", key: '2' },
{ name: "王五", key: '3' },
{ name: "张三", key: '1' },
{ name: "李四", key: '2' }
];
需求:把key值相同的对象删掉,下面是想要的结果
1.双层for循环
两两比较,如果后一个对象的key值和前一个对象的key值相等,就把后面的对象删除。
let arrObj = [
{ name: "张三", key: '1' },
{ name: "李四", key: '2' },
{ name: "王五", key: '3' },
{ name: "张三", key: '1' },
{ name: "李四", key: '2' }
]
function uniqueArr (arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[i].key == arr[j].key) {
arr.splice(j, 1)
j--
}
}
}
return arr
}
console.log(uniqueArr(arrObj));
2、对象访问属性的方法
采用对象访问属性的方法,判断属性值是否存在。
let arrObj = [
{ name: "张三", key: '1' },
{ name: "李四", key: '2' },
{ name: "王五", key: '3' },
{ name: "张三", key: '1' },
{ name: "李四", key: '2' }
]
function uniqueArr (arr) {
var result = []
var obj = {}
for (var i = 0; i < arr.length; i++) {
if (!obj[arr[i].key]) {
result.push(arr[i])
obj[arr[i].key] = true
}
}
return result
}
console.log(uniqueArr(arrObj));
3、Map()方法
has方法可以判断Map对象中是否存在指定元素,有则返回true,否则返回false
set方法可以向Map对象添加新元素 map.set(key, value)
values方法可以返回Map对象值的遍历器对象
let arrObj = [
{ name: "张三", key: '1' },
{ name: "李四", key: '2' },
{ name: "王五", key: '3' },
{ name: "张三", key: '1' },
{ name: "李四", key: '2' }
]
// 方法一:
let map = new Map()
for (let item of arrObj) {
if (!map.has(item.key)) {
map.set(item.key, item)
};
};
arr = [...map.values()]
console.log(arr)
// 方法二: (代码较为简洁)
const map = new Map()
const newArr = arrObj.filter(v => !map.has(v.key) && map.set(v.key, 1))
console.log(newArr);
4、reduce方法
let arrObj = [
{ name: "张三", key: '1' },
{ name: "李四", key: '2' },
{ name: "王五", key: '3' },
{ name: "张三", key: '1' },
{ name: "李四", key: '2' }
]
var obj = {}
arrObj = arrObj.reduce(function (item, next) {
obj[next.key] ? '' : obj[next.key] = true && item.push(next)
return item
}, [])
console.log(arrObj);
5. lodash
即上面的方法。