如何检查对象数组是否具有重复的 属性 值?
How can I check if the array of objects have duplicate property values?
我在遍历数组时需要一些帮助,我总是卡住或重新发明轮子。
values = [
{ name: 'someName1' },
{ name: 'someName2' },
{ name: 'someName1' },
{ name: 'someName1' }
]
如何检查数组中是否有两个(或更多)同名值?我不需要计数器,如果数组值不唯一,只需设置一些变量。请记住,数组长度是动态的,数组值也是动态的。
ECMA 脚本 6 版本
如果您处于支持 ECMA Script 6 的 Set
, then you can use Array.prototype.some
和 Set
对象的环境中,像这样
let seen = new Set();
var hasDuplicates = values.some(function(currentObject) {
return seen.size === seen.add(currentObject.name).size;
});
在这里,我们将每个对象的 name
插入到 Set
中,并检查添加前后的 size
是否相同。这是有效的,因为 Set.size
returns 是一个基于唯一数据的数字(如果数据是唯一的,则设置只添加条目)。 If/when 你有重复的名字,大小不会增加(因为数据不会是唯一的)这意味着我们已经看到了当前的名字并且它将 return 为真。
ECMA 脚本 5 版本
如果你没有 Set
支持,那么你可以使用普通的 JavaScript 对象本身,就像这样
var seen = {};
var hasDuplicates = values.some(function(currentObject) {
if (seen.hasOwnProperty(currentObject.name)) {
// Current name is already seen
return true;
}
// Current name is being seen for the first time
return (seen[currentObject.name] = false);
});
同样可以写的简洁一点,像这样
var seen = {};
var hasDuplicates = values.some(function (currentObject) {
return seen.hasOwnProperty(currentObject.name)
|| (seen[currentObject.name] = false);
});
注:这两种情况我们都用Array.prototype.some
因为会短路。一旦它从函数中获得真值,它会立即 return true
,它不会处理其余的元素。
您可以使用 map
to return just the name, and then use this forEach
技巧来检查它是否至少存在两次:
var areAnyDuplicates = false;
values.map(function(obj) {
return obj.name;
}).forEach(function (element, index, arr) {
if (arr.indexOf(element) !== index) {
areAnyDuplicates = true;
}
});
使用array.prototype.map and array.prototype.some:
var values = [
{ name: 'someName1' },
{ name: 'someName2' },
{ name: 'someName4' },
{ name: 'someName2' }
];
var valueArr = values.map(function(item){ return item.name });
var isDuplicate = valueArr.some(function(item, idx){
return valueArr.indexOf(item) != idx
});
console.log(isDuplicate);
与Underscore.js Underscore 可以通过几种方式完成。这是其中之一。检查数组是否已经是唯一的。
function isNameUnique(values){
return _.uniq(values, function(v){ return v.name }).length == values.length
}
配香草JavaScript
通过检查数组中是否没有重复出现的名称。
function isNameUnique(values){
var names = values.map(function(v){ return v.name });
return !names.some(function(v){
return names.filter(function(w){ return w==v }).length>1
});
}
尝试一个简单的循环:
var repeat = [], tmp, i = 0;
while(i < values.length){
repeat.indexOf(tmp = values[i++].name) > -1 ? values.pop(i--) : repeat.push(tmp)
}
To know if simple array has duplicates we can compare first and last indexes of the same value:
函数:
var hasDupsSimple = function(array) {
return array.some(function(value) { // .some will break as soon as duplicate found (no need to itterate over all array)
return array.indexOf(value) !== array.lastIndexOf(value); // comparing first and last indexes of the same value
})
}
测试:
hasDupsSimple([1,2,3,4,2,7])
// => true
hasDupsSimple([1,2,3,4,8,7])
// => false
hasDupsSimple([1,"hello",3,"bye","hello",7])
// => true
For an array of objects we need to convert the objects values to a simple array first:
使用 map
将对象数组转换为简单数组:
var hasDupsObjects = function(array) {
return array.map(function(value) {
return value.suit + value.rank
}).some(function(value, index, array) {
return array.indexOf(value) !== array.lastIndexOf(value);
})
}
测试:
var cardHand = [
{ "suit":"spades", "rank":"ten" },
{ "suit":"diamonds", "rank":"ace" },
{ "suit":"hearts", "rank":"ten" },
{ "suit":"clubs", "rank":"two" },
{ "suit":"spades", "rank":"three" },
]
hasDupsObjects(cardHand);
// => false
var cardHand2 = [
{ "suit":"spades", "rank":"ten" },
{ "suit":"diamonds", "rank":"ace" },
{ "suit":"hearts", "rank":"ten" },
{ "suit":"clubs", "rank":"two" },
{ "suit":"spades", "rank":"ten" },
]
hasDupsObjects(cardHand2);
// => true
如果您要查找布尔值,最快的方法是
var values = [
{ name: 'someName1' },
{ name: 'someName2' },
{ name: 'someName1' },
{ name: 'someName1' }
]
// solution
var hasDuplicate = false;
values.map(v => v.name).sort().sort((a, b) => {
if (a === b) hasDuplicate = true
})
console.log('hasDuplicate', hasDuplicate)
//checking duplicate elements in an array
var arr=[1,3,4,6,8,9,1,3,4,7];
var hp=new Map();
console.log(arr.sort());
var freq=0;
for(var i=1;i<arr.length;i++){
// console.log(arr[i-1]+" "+arr[i]);
if(arr[i]==arr[i-1]){
freq++;
}
else{
hp.set(arr[i-1],freq+1);
freq=0;
}
}
console.log(hp);
在 TS 和 ES6 中,您可以创建一个新的 Set,其中 属性 是唯一的,并将其大小与原始数组进行比较。
const values = [
{ name: 'someName1' },
{ name: 'someName2' },
{ name: 'someName3' },
{ name: 'someName1' }
]
const uniqueValues = new Set(values.map(v => v.name));
if (uniqueValues.size < values.length) {
console.log('duplicates found')
}
添加更新的 es6 函数来检查数组中的唯一值和重复值。此功能是模块化的,可以在整个代码库中重复使用。感谢以上所有post。
/* checks for unique keynames in array */
const checkForUnique = (arrToCheck, keyName) => {
/* make set to remove duplicates and compare to */
const uniqueValues = [...new Set(arrToCheck.map(v => v[keyName]))];
if(arrToCheck.length !== uniqueValues.length){
console.log('NOT UNIQUE')
return false
}
return true
}
let arr = [{name:'joshua'},{name:'tony'},{name:'joshua'}]
/* call function with arr and key to check for */
let isUnique = checkForUnique(arr,'name')
试试这个功能,它通过一步删除重复项来扩展你原来的问题。您会得到一个删除了重复项的 return 数组。
const test = [
{ name: 'someName1' },
{ name: 'someName1' },
{ name: 'someName2' },
{ name: 'someName3' }
]
function removeDup(arrayOfObjects) {
if (new Set(arrayOfObjects.map((v) => v.name)).size < arrayOfObjects.length) {
const _set = new Set();
const _data = arrayOfObjects;
for (const i in _data) {
_set.add(JSON.stringify(_data[i]));
}
return Array.from(_set).map((i) =>
JSON.parse(i)
);
}
}
const res = removeDup(test)
console.log(res)
你只需要一行代码。
var values = [
{ name: 'someName1' },
{ name: 'someName2' },
{ name: 'someName4' },
{ name: 'someName2' }
];
let hasDuplicates = values.map(v => v.name).length > new Set(values.map(v => v.name)).size ? true : false;
const values = [
{ name: 'someName1' },
{ name: 'someName2' },
{ name: 'someName4' },
{ name: 'someName4' }
];
const foundDuplicateName = values.find((nnn, index) =>{
return values.find((x, ind)=> x.name === nnn.name && index !== ind )
})
console.log(foundDuplicateName)
找到第一个重名
const values = [
{ name: 'someName1' },
{ name: 'someName2' },
{ name: 'someName4' },
{ name: 'someName4' }
];
const foundDuplicateName = values.find((nnn, index) =>{
return values.find((x, ind)=> x.name === nnn.name && index !== ind )
})
我在遍历数组时需要一些帮助,我总是卡住或重新发明轮子。
values = [
{ name: 'someName1' },
{ name: 'someName2' },
{ name: 'someName1' },
{ name: 'someName1' }
]
如何检查数组中是否有两个(或更多)同名值?我不需要计数器,如果数组值不唯一,只需设置一些变量。请记住,数组长度是动态的,数组值也是动态的。
ECMA 脚本 6 版本
如果您处于支持 ECMA Script 6 的 Set
, then you can use Array.prototype.some
和 Set
对象的环境中,像这样
let seen = new Set();
var hasDuplicates = values.some(function(currentObject) {
return seen.size === seen.add(currentObject.name).size;
});
在这里,我们将每个对象的 name
插入到 Set
中,并检查添加前后的 size
是否相同。这是有效的,因为 Set.size
returns 是一个基于唯一数据的数字(如果数据是唯一的,则设置只添加条目)。 If/when 你有重复的名字,大小不会增加(因为数据不会是唯一的)这意味着我们已经看到了当前的名字并且它将 return 为真。
ECMA 脚本 5 版本
如果你没有 Set
支持,那么你可以使用普通的 JavaScript 对象本身,就像这样
var seen = {};
var hasDuplicates = values.some(function(currentObject) {
if (seen.hasOwnProperty(currentObject.name)) {
// Current name is already seen
return true;
}
// Current name is being seen for the first time
return (seen[currentObject.name] = false);
});
同样可以写的简洁一点,像这样
var seen = {};
var hasDuplicates = values.some(function (currentObject) {
return seen.hasOwnProperty(currentObject.name)
|| (seen[currentObject.name] = false);
});
注:这两种情况我们都用Array.prototype.some
因为会短路。一旦它从函数中获得真值,它会立即 return true
,它不会处理其余的元素。
您可以使用 map
to return just the name, and then use this forEach
技巧来检查它是否至少存在两次:
var areAnyDuplicates = false;
values.map(function(obj) {
return obj.name;
}).forEach(function (element, index, arr) {
if (arr.indexOf(element) !== index) {
areAnyDuplicates = true;
}
});
使用array.prototype.map and array.prototype.some:
var values = [
{ name: 'someName1' },
{ name: 'someName2' },
{ name: 'someName4' },
{ name: 'someName2' }
];
var valueArr = values.map(function(item){ return item.name });
var isDuplicate = valueArr.some(function(item, idx){
return valueArr.indexOf(item) != idx
});
console.log(isDuplicate);
与Underscore.js Underscore 可以通过几种方式完成。这是其中之一。检查数组是否已经是唯一的。
function isNameUnique(values){
return _.uniq(values, function(v){ return v.name }).length == values.length
}
配香草JavaScript 通过检查数组中是否没有重复出现的名称。
function isNameUnique(values){
var names = values.map(function(v){ return v.name });
return !names.some(function(v){
return names.filter(function(w){ return w==v }).length>1
});
}
尝试一个简单的循环:
var repeat = [], tmp, i = 0;
while(i < values.length){
repeat.indexOf(tmp = values[i++].name) > -1 ? values.pop(i--) : repeat.push(tmp)
}
To know if simple array has duplicates we can compare first and last indexes of the same value:
函数:
var hasDupsSimple = function(array) {
return array.some(function(value) { // .some will break as soon as duplicate found (no need to itterate over all array)
return array.indexOf(value) !== array.lastIndexOf(value); // comparing first and last indexes of the same value
})
}
测试:
hasDupsSimple([1,2,3,4,2,7])
// => true
hasDupsSimple([1,2,3,4,8,7])
// => false
hasDupsSimple([1,"hello",3,"bye","hello",7])
// => true
For an array of objects we need to convert the objects values to a simple array first:
使用 map
将对象数组转换为简单数组:
var hasDupsObjects = function(array) {
return array.map(function(value) {
return value.suit + value.rank
}).some(function(value, index, array) {
return array.indexOf(value) !== array.lastIndexOf(value);
})
}
测试:
var cardHand = [
{ "suit":"spades", "rank":"ten" },
{ "suit":"diamonds", "rank":"ace" },
{ "suit":"hearts", "rank":"ten" },
{ "suit":"clubs", "rank":"two" },
{ "suit":"spades", "rank":"three" },
]
hasDupsObjects(cardHand);
// => false
var cardHand2 = [
{ "suit":"spades", "rank":"ten" },
{ "suit":"diamonds", "rank":"ace" },
{ "suit":"hearts", "rank":"ten" },
{ "suit":"clubs", "rank":"two" },
{ "suit":"spades", "rank":"ten" },
]
hasDupsObjects(cardHand2);
// => true
如果您要查找布尔值,最快的方法是
var values = [
{ name: 'someName1' },
{ name: 'someName2' },
{ name: 'someName1' },
{ name: 'someName1' }
]
// solution
var hasDuplicate = false;
values.map(v => v.name).sort().sort((a, b) => {
if (a === b) hasDuplicate = true
})
console.log('hasDuplicate', hasDuplicate)
//checking duplicate elements in an array
var arr=[1,3,4,6,8,9,1,3,4,7];
var hp=new Map();
console.log(arr.sort());
var freq=0;
for(var i=1;i<arr.length;i++){
// console.log(arr[i-1]+" "+arr[i]);
if(arr[i]==arr[i-1]){
freq++;
}
else{
hp.set(arr[i-1],freq+1);
freq=0;
}
}
console.log(hp);
在 TS 和 ES6 中,您可以创建一个新的 Set,其中 属性 是唯一的,并将其大小与原始数组进行比较。
const values = [
{ name: 'someName1' },
{ name: 'someName2' },
{ name: 'someName3' },
{ name: 'someName1' }
]
const uniqueValues = new Set(values.map(v => v.name));
if (uniqueValues.size < values.length) {
console.log('duplicates found')
}
添加更新的 es6 函数来检查数组中的唯一值和重复值。此功能是模块化的,可以在整个代码库中重复使用。感谢以上所有post。
/* checks for unique keynames in array */
const checkForUnique = (arrToCheck, keyName) => {
/* make set to remove duplicates and compare to */
const uniqueValues = [...new Set(arrToCheck.map(v => v[keyName]))];
if(arrToCheck.length !== uniqueValues.length){
console.log('NOT UNIQUE')
return false
}
return true
}
let arr = [{name:'joshua'},{name:'tony'},{name:'joshua'}]
/* call function with arr and key to check for */
let isUnique = checkForUnique(arr,'name')
试试这个功能,它通过一步删除重复项来扩展你原来的问题。您会得到一个删除了重复项的 return 数组。
const test = [
{ name: 'someName1' },
{ name: 'someName1' },
{ name: 'someName2' },
{ name: 'someName3' }
]
function removeDup(arrayOfObjects) {
if (new Set(arrayOfObjects.map((v) => v.name)).size < arrayOfObjects.length) {
const _set = new Set();
const _data = arrayOfObjects;
for (const i in _data) {
_set.add(JSON.stringify(_data[i]));
}
return Array.from(_set).map((i) =>
JSON.parse(i)
);
}
}
const res = removeDup(test)
console.log(res)
你只需要一行代码。
var values = [
{ name: 'someName1' },
{ name: 'someName2' },
{ name: 'someName4' },
{ name: 'someName2' }
];
let hasDuplicates = values.map(v => v.name).length > new Set(values.map(v => v.name)).size ? true : false;
const values = [
{ name: 'someName1' },
{ name: 'someName2' },
{ name: 'someName4' },
{ name: 'someName4' }
];
const foundDuplicateName = values.find((nnn, index) =>{
return values.find((x, ind)=> x.name === nnn.name && index !== ind )
})
console.log(foundDuplicateName)
找到第一个重名
const values = [
{ name: 'someName1' },
{ name: 'someName2' },
{ name: 'someName4' },
{ name: 'someName4' }
];
const foundDuplicateName = values.find((nnn, index) =>{
return values.find((x, ind)=> x.name === nnn.name && index !== ind )
})