现在后台数据返回的数组对象如下所示,JS如何去除重复的数据呢?求解答~
data=[
{cnode:'0107',cname:'北京'},
{cnode:'0107',cname:'北京'},
{cnode:'0105',cname:'上海'},
{cnode:'0105',cname:'上海'},
]
现在后台数据返回的数组对象如下所示,JS如何去除重复的数据呢?求解答~
data=[
{cnode:'0107',cname:'北京'},
{cnode:'0107',cname:'北京'},
{cnode:'0105',cname:'上海'},
{cnode:'0105',cname:'上海'},
]
对象数组去重涉及的内容非常多,并不是几个简单处理就能解决。
更不是一个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()成数组就行了。
13 回答12.9k 阅读
7 回答2.1k 阅读
3 回答1.3k 阅读✓ 已解决
2 回答1.3k 阅读✓ 已解决
6 回答1.2k 阅读✓ 已解决
6 回答1.1k 阅读
2 回答1.3k 阅读✓ 已解决
利用Object 键值对进行数组去重
推荐github上的一篇文章,传送门:JavaScript专题之数组去重
里面写了很多种数组去重的方法,其中有你想要的