如何判断数组对象里面有相同的元素

var a = [{des:"qwe",b:"reg"},{des:"vfg",b:"fgdfd"},{des:"qwe",b:"fdfd"},{des:"vfg",b:"fdfd"}]

怎么样判断 a[i].des在整个数组对象中有相同的des对应的值?

阅读 29.7k
6 个回答

重组一下,建立一个 des => model[] 的映射表

var a = [
    { des: "qwe", b: "reg" },
    { des: "vfg", b: "fgdfd" },
    { des: "qwe", b: "fdfd" }
];

var map = a.reduce((all, m) => {
    let list = all.get(m.des);
    if (!list) {
        list = [];
        all.set(m.des, list);
    }
    list.push(m);
    return all;
}, new Map());

Array.from(map.entries())
    // 这里过滤掉 list 只有一个元素的,剩下的就是有重复的
    .filter(([des, list]) => list.length > 1)
    .forEach(([des, list]) => {
        values = list.map(m => m.b);
        console.log(des, values);
    });
/**判断数组中 某个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也可以,不过要获取{}的长度比较麻烦

看了一下。楼上的答案,基本上是没问题的。如果是es5可以循环,es6就是楼上的例子。

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