js对象数组怎么去重?

现在后台数据返回的数组对象如下所示,JS如何去除重复的数据呢?求解答~

data=[
{cnode:'0107',cname:'北京'},
{cnode:'0107',cname:'北京'},
{cnode:'0105',cname:'上海'},
{cnode:'0105',cname:'上海'},
]
阅读 6.7k
8 个回答

利用Object 键值对进行数组去重
推荐github上的一篇文章,传送门:JavaScript专题之数组去重
里面写了很多种数组去重的方法,其中有你想要的

对象数组去重涉及的内容非常多,并不是几个简单处理就能解决。

更不是一个set就能包揽所有。

首先,下面的代码考虑的时候 cnode 和 cname 可能不相同的情况,代码暂时没有考虑任何的优化。

如果 cnode 和 cname 一定是相同的,则使用第一个回答的 hash 方案就可以

    var data = [
        { cnode: '0107', cname: '北京' },
        { cnode: '0107', cname: '北京' },
        { cnode: '0105', cname: '上海' },
        { cnode: '0105', cname: '上海' },
    ];
    
    function getNewObjArr(data) {
        var newData = [];
        for (var i = 0, len = data.length; i < len; i++) {
            var flag = 1;
            for (var j = 0, len2 = newData.length; j < len2; j++) {
                if(newData[j].cnode === data[i].cnode && newData[j].cname === data[i].cname){
                    flag=0;
                    break;
                }
            }
            flag === 1 ? newData.push(data[i]):false;
        }
        return newData;
    }
    console.log(getNewObjArr(data));

很多种方法这里说一个,创建一个对象,把cnode作为键值

function uniqueData(data) {
    var result = [];
    var hash = {};
    data.forEach(function(ele) {
        if (!hash[ele.cnode]) {
            console.log(hash[ele.cnode]);
            result.push(ele);
            hash[ele.cnode] = true;
        }
    })
    return result;
}

Array.prototype.unique = function(key) {

var arr = this;
if (arr.length == 0) {
    return [];
};
var n = [arr[0]];
for (var i = 1; i < arr.length; i++) {
    if (key === undefined) {
        if (n.indexOf(arr[i]) == -1) n.push(arr[i]);
    } else {
        var has = false;
        inner: for (var j = 0; j < n.length; j++) {
            if (arr[i][key] == n[j][key]) {
                has = true;
                break inner;
            }
        }
        if (!has) {
            n.push(arr[i]);
        }
    }
}
return n;

};

最简单的办法就是:
先遍历数组,把里面的对象用JSON.stringify()处理成字符串;
然后新建一个对象,把这些字符串当成key,value随意加进新的对象中;
最后把新建的对象,Object.keys()成数组就行了。

新手上路,请多包涵

es6 [set]

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题