- 如果要判断数组中是否存在某个元素的话很好判断,直接用数组的indexOf方法就好,存在返回当前索引不存在返回-1,还有就是es6的includes方法,存在返回true不存在返回false(建议使用第二种)
let arr=[1,2,3,4]
arr.includes(3) //true
arr.includes(5) //false
- 要只是判断的话是可以遍历后判断对象的属性是否相同的,像这种:
arr.forEach(item=>{
if(item.name=='TiAmo'){
alert('存在这个元素');
}
})
- 但实际中往往是需要动态添加或删除对象或元素的,用这个方法的话不好操作,可能会添加或删除掉多个,可以是用string的indexOf方法来判断
const option = {name:'LeeSin'}
// 如果数组里面本身不存在这个对象则把这个加进去
if(JSON.stringify(arr).indexOf(JSON.stringify(option))==-1){
arr.push(option); // 进行动态的操作
}
这个判断是可以,但存在一个问题需要注意一下,如果对象的顺序不一样,是不能检测到重复的
例如
arr = [{name:'LeeSin', sex:'男'}]
option = {sex:'男', name:'LeeSin'}
利用上述方法检测的话,实际上该数组是存在这个数组对象的,但如果用string的indexOf方法是不能检测对的,用这个方法的时候这个点需要注意。
- 利用数组API some来判断
let result = arr.some(item=>{
if(item.name=='LeeSin'){
return true
}
})
console.log(result) // 如果arr数组对象中含有name:'LeeSin',就会返回true,否则返回false
if(result){ // 如果存在
// do something
}
- 加一个使用reduce来实现根据数组属性去重(其实第四点也可以实现去重)
let arr = [{
key: "01",
value: "压缩",
},
{
key: "02",
value: "永恩",
},
{
key: "03",
value: "戏命师.烬",
},
{
key: "04",
value: "卢锡安",
},
{
key: "05",
value: "男枪",
},
{
key: "06",
value: "李青",
},
{
key: "01",
value: "压缩",
},
{
key: "02",
value: "永恩",
},
{
key: "03",
value: "戏命师.烬",
},
];
/**
* reduce 接收 2 个参数:第一个参数是回调函数(必选),
* 第二个参数是初始值 initialValue(可选) 。
* 而第一个参数(回调函数),接收下面四个参数:
* Accumulator (acc) (累计器)
* Current Value (cur) (当前值)
* Current Index (idx) (当前索引)
* Source Array (src) (源数组)
*/
const obj = {}; //利用reduce方法遍历数组,reduce第一个参数是遍历需要执行的函数,第二个参数是acc的初始值
const arr = arr.reduce((acc, cur) => {
obj[cur.key] ? '' : obj[cur.key] = true && acc.push(cur);
return acc;
}, []);
function uniqueFunc(arr, uniId){
const res = new Map();
return arr.filter((item) => !res.has(item[uniId]) && res.set(item[uniId], 1));
}
uniqueFunc(arr,key)
- 使用filter来实现根据数组对象去重
let arr = [{
key: "01",
value: "压缩",
},
{
key: "02",
value: "永恩",
},
{
key: "03",
value: "戏命师.烬",
},
{
key: "04",
value: "卢锡安",
},
{
key: "05",
value: "男枪",
},
{
key: "06",
value: "李青",
},
{
key: "01",
value: "压缩",
},
{
key: "02",
value: "永恩",
},
{
key: "03",
value: "戏命师.烬",
},
];
/**
* 数组对象去重方法 filter
* @param arr
* @returns {*[]}
*/
export function uniqueFunc(arr) {
const res = []
arr.forEach(item => {
if(typeof item === 'object' && item !== null){
const tmp = res.filter(i => JSON.stringify(i) === JSON.stringify(item));
if(tmp.length === 0) {
res.push(item)
}
}
})
return res;
}
- 获取key值相同的元素并组成新的数组
const resultArray = arr.reduce((acc: any, curr: any) => {
const foundItem = acc.find((item: any) => item.key === curr.key)
if (foundItem) {
foundItem.values.push(curr)
} else {
acc.push({ key: curr.key, values: [curr] })
}
return acc
}, [])