Necesito ayuda para iterar a través de la matriz, sigo atascado o reinventando la rueda.
values = [ { name: 'someName1' }, { name: 'someName2' }, { name: 'someName1' }, { name: 'someName1' } ]¿Cómo podría verificar si hay dos (o más) valores del mismo nombre en la matriz? No necesito un contador, solo establezco alguna variable si los valores de la matriz no son únicos. Tenga en cuenta que la longitud de la matriz es dinámica, también los valores de la matriz.
Utilice array.prototype.map y 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);Versión ECMA Script 6
Si se encuentra en un entorno que admite Set de ECMA Script 6, entonces puede usar Array.prototype.some y un objeto Set , como este
let seen = new Set(); var hasDuplicates = values.some(function(currentObject) { return seen.size === seen.add(currentObject.name).size; }); Aquí, insertamos el name de todos y cada uno de los objetos en el Set y verificamos si el size antes y después de agregar es el mismo. Esto funciona porque Set.size devuelve un número basado en datos únicos (set solo agrega entradas si los datos son únicos). Si/cuando tiene nombres duplicados, el tamaño no aumentará (porque los datos no serán únicos), lo que significa que ya habríamos visto el nombre actual y devolverá verdadero.
Versión ECMA Script 5
Si no tiene soporte para Set , entonces puede usar un objeto JavaScript normal, como este
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); });Lo mismo se puede escribir sucintamente, así
var seen = {}; var hasDuplicates = values.some(function (currentObject) { return seen.hasOwnProperty(currentObject.name) || (seen[currentObject.name] = false); }); Nota: En ambos casos, usamos Array.prototype.some porque provocará un cortocircuito. En el momento en que obtenga un valor verdadero de la función, devolverá true inmediatamente, no procesará el resto de los elementos.
En TS y ES6, puede crear un nuevo conjunto con la propiedad de ser único y comparar su tamaño con la matriz original.
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') }