var a = [{des:"qwe",b:"reg"},{des:"vfg",b:"fgdfd"},{des:"qwe",b:"fdfd"},{des:"vfg",b:"fdfd"}]
怎么样判断 a[i].des在整个数组对象中有相同的des对应的值?
var a = [{des:"qwe",b:"reg"},{des:"vfg",b:"fgdfd"},{des:"qwe",b:"fdfd"},{des:"vfg",b:"fdfd"}]
怎么样判断 a[i].des在整个数组对象中有相同的des对应的值?
/**判断数组中 某个key是否重复
*param arr 判断的数组
*param key 判断的key
*return 重复返回false 不重复返回一个对象 对象格式{ arr[i][key]:arr[i] ...}
*/
function arrTest(arr,key){
var obj = {};
for(var i=0;i<arr.length;i++){
if(obj[arr[i][key]]){
return false;
}else{
obj[arr[i][key]] = arr[i];
}
return obj;
}
}
arrTest(a,"des")
在边城大神的基础上改的,大神用的一些方法平时接触的少,自己理解起来有点困难,所以改了下
var a = [
{ des: "qwe", b: "reg" },
{ des: "vfg", b: "fgdfd" },
{ des: "qwe", b: "fdfd" }
];
// arr--原始数组; param--对比的具体key
// 返回的isDuplicate即是否有重复;
// 返回的newArr即过掉过后的新数组,感觉大部分时候我们想要的只是一个不重复的数组而已;
function filter(arr, param) {
if (Array.isArray(arr)) {
let temp = [];
let newArr = arr.reduce((acc, cur) => {
if (temp.indexOf(cur[param]) === -1) {
temp.push(cur[param]);
acc.push(cur);
return acc;
} else {
console.log(acc);
return acc;
}
}, []);
// 可以用别的方法判断是否有重复,毕竟已经把重复的项过滤掉了
let isDuplicate = newArr.length === arr.length;
return { newArr, isDuplicate };
}
}
filter(a, "des");
function Arr(arr){
var o = {};
var index = 0; // 计数
for(var i=0;i<arr.length;i++){
o[arr[i].des]=index++;
}
console.log(o);
}
Arr(a); // Object {qwe: 2, vfg: 1} 出现超过1次的即为符合条件的元素
可以引入lodash的话.可以用_.uniqBy(arr, key)然后比较下前后数组长度.
如果能用Set的话,可以这么搞
var s = new Set()
a.forEach(i => s.add(i.des))
if(a.length !== s.size) {
return false
}
如果都不能用,用{}代替Set也可以,不过要获取{}的长度比较麻烦
27 回答13k 阅读
8 回答3.5k 阅读✓ 已解决
6 回答1.3k 阅读✓ 已解决
5 回答5.3k 阅读✓ 已解决
4 回答1.6k 阅读✓ 已解决
3 回答1.7k 阅读
4 回答2.3k 阅读✓ 已解决
重组一下,建立一个
des => model[]
的映射表