js判断对象数组中是否存在某个对象和数组对象去重,获取相同属性值组成新的数组

12,088 阅读3分钟
  1. 如果要判断数组中是否存在某个元素的话很好判断,直接用数组的indexOf方法就好,存在返回当前索引不存在返回-1,还有就是es6的includes方法,存在返回true不存在返回false(建议使用第二种)
let arr=[1,2,3,4]
arr.includes(3) //true
arr.includes(5) //false
  1. 要只是判断的话是可以遍历后判断对象的属性是否相同的,像这种:
arr.forEach(item=>{
    if(item.name=='TiAmo'){
       alert('存在这个元素');
    }
})
  1. 但实际中往往是需要动态添加或删除对象或元素的,用这个方法的话不好操作,可能会添加或删除掉多个,可以是用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方法是不能检测对的,用这个方法的时候这个点需要注意。

  1. 利用数组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
 }
 
 
  1. 加一个使用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) (源数组)
 */
var obj = {}; //利用reduce方法遍历数组,reduce第一个参数是遍历需要执行的函数,第二个参数是acc的初始值
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)
 
  1. 使用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;
}
  1. 获取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  
}, [])