Javascript 如何检查数组在特定对象属性上是否唯一?

Javascript 如何检查数组在特定对象属性上是否唯一?,javascript,arrays,Javascript,Arrays,我有一个对象数组: var array1 = [ { property1: 10, property2: "abc" }, { property1: 11, property2: "def" }, { property1: 10, property2: "ghi" } ]; 现在我想要的是,根据property1的值,这个数组将被称为非唯一数组 这意味着该数组包含两个property1=10的元素,因此该数组不包含pro

我有一个对象数组:

var array1 = [
  {
    property1: 10,
    property2: "abc"
  }, 
  {
    property1: 11,
    property2: "def"
  },
  {
    property1: 10,
    property2: "ghi"
  }
];
现在我想要的是,根据
property1
的值,这个数组将被称为非唯一数组

这意味着该数组包含两个
property1=10
的元素,因此该数组不包含
property1
的唯一值

要检查这一点,我可以使用
for
循环:

for (var i = 0; i < array1.length; i++) {
  var array2 = array1.slice(); // copy array
  array2.remove(array1[i]);
  var temppropety1 = array1[i].property1;
  for (var j = 0; j < array2.length; j++) {
    if (array2[J].property1==temppropety1) {
      return true;
    }
  }
}
for(变量i=0;i

但是有没有更简单的方法或库来找到它呢?

我建议数组可以很大,所以我不想复制它,而只是验证属性

此外,不能使用数组的映射函数,因为在这种情况下,您将无法在第一次匹配时中断一个循环:

var equals = function(array) {
    var co = {};
    var unique = true;
    for(var i = 0; i < array.length; i++) {
        var o = array[i];
        if (co[o.property1]) {
            unique = false;
            break;
        } else {
            co[o.property1] = true;
        }
    }
    return unique;
};
var等于=函数(数组){
var co={};
var-unique=true;
对于(var i=0;i
您可以将阵列转换为平面结构:

array1.map(function(item) { return item.property1; });
现在,您的问题简化为在简单数组中检查重复项

var array1 = ["a","b","b","c","d","e","f"];
var uniqueItems = [];
$.each(array1, function(i, el){
    if($.inArray(el, uniqueItems) === -1) uniqueItems.push(el);
});
参考资料:


您可以使用两个助手来抽象它:

var uniqBy = function(f, xs) {
  var seen = []
  return xs.filter(function(x) {
    var fx = f(x)
    if (seen.indexOf(fx) > -1) return
    seen.push(fx)
    return true
  })
}

var dot = function(k) {
  return function(obj) {
    return obj[k]
  }
}
然后按属性过滤掉重复的,并将结果的长度与原始数组进行比较。如果它们不匹配,则它们不能是唯一的:

var res = uniqBy(dot('property1'), array1)
var isUnique = array1.length === res.length

console.log(isUnique) // false
如果只有数字或字符串可从中删除重复项,则可以使用对象而不是数组来跟踪到目前为止看到的元素,从而提高性能。

首先,可以通过按property1的值对对象进行分组来减少(聚合)对象:

var grouped = array.reduce(function(grouped, item) {
    var propertyValue = item.property1;
    grouped[propertyValue] = (grouped[propertyValue] || 0) + 1;
    return grouped;
}, {});
然后检查结果对象的每个关键点的值是否为1:

var result = Object.keys(grouped).every(function(key) {
    return grouped[key] === 1;
});

下面是测试
属性1
唯一性的简单方法。循环遍历外部数组中的对象,并将每个对象的
属性1
添加到临时数组中(如果该临时数组中尚未包含)。如果遇到重复值,则返回
false
表示
property1
不唯一

function isUnique(arr) {
   var tmpArr = [];
   for(var obj in arr) {
     if(tmpArr.indexOf(arr[obj].property1) < 0){ 
       tmpArr.push(arr[obj].property1);
     } else {
       return false; // Duplicate value for property1 found
     }
   }
   return true; // No duplicate values found for property1
}
函数是唯一的(arr){
var-tmpArr=[];
用于(arr中的var obj){
if(tmpArr.indexOf(arr[obj].property1)<0{
tmpArr.push(arr[obj].property1);
}否则{
返回false;//找到属性1的重复值
}
}
返回true;//未找到属性1的重复值
}

演示:

您可以使用lodash库来实现这一点

以下是图书馆文档:

方法:-

function isDuplicatesPresent(list, propertyName){
   return _.filter(list, function (value) { 
       return _.filter(list, function(innerValue){ reutrn innerValue[propertyName] === value[propertyName]}).length > 1;   
   }).length > 0;
}
例如:-

var users = [
  { user: 'barney', age: 36, active: true },
  { user: 'fred',  age: 40, active: false },
  { user: 'barney', age: 37, active: true}
];

let duplicates = _.filter(users, function (value) { 
    return _.filter(users, {user:value.user}).length > 1;   
});
结果:

console.log(duplicates)
> [
   {"user": "barney","age": 36,"active": true},
   {"user": "barney","age": 37,"active": true}
 ];
选中此下划线: