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}
];
选中此下划线: