Tengo un formulario donde los usuarios pueden agregar "filas" de elementos. Digamos que cada fila tiene un "nombre" y "babosa". El resultado de esto es una matriz de objetos, así:

[
 {
 "name": "Bananas",
 "slug": "bananas"
},{
 "name": "Bananas",
 "slug": "bananas"
},{
 "name": "Silver Spoons",
 "slug": "silver_spoons"
},{
 "name": "Silver Spoons",
 "slug": "silver_spoons"
}
]

Ahora, dado que un usuario ingresa esto. Quiero encontrar, para cada duplicado 'slug', el índice de su primera aparición , para poder mostrar un error de validación en esa fila. Entiendo que puedo _.pluck eliminar fácilmente los identificadores, pero todavía no estoy seguro de cuál sería el mejor enfoque después de eso. Cualquier ayuda sería muy apreciada.

0
Steven 3 sep. 2014 a las 14:22

2 respuestas

La mejor respuesta

Ampliando la respuesta de Margus, podría hacer algo como esto:

Recorra la matriz que almacena el índice de la primera aparición de slug en un hashmap.

Luego, si encuentra otra aparición de la misma babosa, agregue el índice de la primera aparición a una matriz.

function getFirstOccurences(arr) {
    var items = {};
    var alreadyExist = [];
    arr.forEach(function(item, index) {
        if(items.hasOwnProperty(item.slug)) {
            alreadyExist.push(items[item.slug]);
        }
        else {
            items[item.slug] = index;
        }
    });
    return alreadyExist;
}

Editar: se corrigió la comprobación del elemento existente y se agregó violín aquí

0
imcg 3 sep. 2014 a las 11:37

Puede usar jQuery en la matriz

var items = [
    {
     "name": "Bananas",
     "slug": "bananas"
    },{
     "name": "Bananas",
     "slug": "bananas"
    },{
     "name": "Silver Spoons",
     "slug": "silver_spoons"
    },{
     "name": "Silver Spoons",
     "slug": "silver_spoons"
    }
]; 
var names = [];
var duplicates = [];
for(var i = 0; i < items.length; i++ ) {
    var value = items[i].name;
    if ($.inArray(value, names) > -1) {
        duplicates.push(i);
    } else {
        names.push(value);
    }
}
alert(names.toString());
alert(duplicates.toString());

Ejemplo: jsFiddle

0
Margus 3 sep. 2014 a las 11:02