js数组对象去重问题

存入数组对象时判断一下是否存在,我这样写为什么不行,我哪里写错了,能指点一下吗,谢谢

    ADD_ROUTE: (state, action) => {
        console.log(state.localSelectArr);
        if (state.localSelectArr.indexOf(action) == -1) {
            state.localSelectArr.push(action);
        } else {
            console.log('已存在');
            return;
        }
    }
阅读 3.2k
6 个回答

action是什么类型的数据

// 试试这样可以吗
ADD_ROUTE: (state, action) => {
    let data = JSON.parse(JSON.stringify(state))
    if (state.localSelectArr.indexOf(action) == -1) {
        data.localSelectArr.push(action);
        state = data;
    } else {
        console.log('已存在');
        return;
    }
}

clipboard.png

indexOf只能检测基础类型的,如果数组中有存储object或者function等,使用indexOf检测时,两者是不相等的

当然不行啊 一个对象不会等于另一个对象的,除非它是另一个对象的浅拷贝,否则即使你的对象内容一样,它的指针也不会一样,因此它两永远不会相等的

本来想插入时判断,是否存在,现在退而求其次,插入后去重

    export function deteleObject(obj) {
        var uniques = [];
        var stringify = {};
        for (var i = 0; i < obj.length; i++) {
            var keys = Object.keys(obj[i]);
            keys.sort(function (a, b) {
                return (Number(a) - Number(b));
            });
            var str = '';
            for (var j = 0; j < keys.length; j++) {
                str += JSON.stringify(keys[j]);
                str += JSON.stringify(obj[i][keys[j]]);
            }
            if (!stringify.hasOwnProperty(str)) {
                uniques.push(obj[i]);
                stringify[str] = true;
            }
        }
        uniques = uniques;
        return uniques;
    }

这样写试试:

ADD_ROUTE: (state, action) => {
    if (state.localSelectArr.indexOf(action) == -1) {
        state.localSelectArr.push(action);
    }
    return state;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题