var items = [['892','NEW','blue'],
         ['341','USED','red'],
         ['892','NEW','yellow'],
         ['121','USED','blue'],
         ['735','NEW','red'],
         ['121','NEW','blue'],
         ['121','USED','yellow']];

Cada artículo tiene 3 elementos. Si la combinación exacta de los primeros 2 elementos de un elemento ocurre en otra parte de la matriz, entonces necesito generar esos 2 elementos. Entonces, en este caso, la salida deseada debería ser:

output = [['892','NEW'],
          ['121','USED]];
-2
dean2020 28 oct. 2017 a las 09:29

4 respuestas

La mejor respuesta

Potente y simple:

var items = [['892','NEW','blue'],
         ['341','USED','red'],
         ['892','NEW','yellow'],
         ['892','NEW','yellow'],
         ['892','NEW','yellow'],
         ['121','USED','blue'],
         ['735','NEW','red'],
         ['121','NEW','blue'],
         ['121','USED','yellow']];
var output = [];
var spotted = {};


items.map(function(el){
    var string = ''+el[0]+el[1];
    if(spotted[string] === 0){ 
       output.push([el[0],el[1]]);
       spotted[string] = 1;
    }else if(spotted[string] != 1) spotted[string] = 0;
});
console.log(output);
1
pirs 28 oct. 2017 a las 07:44

Podría usar una tabla hash para los mismos dos primeros elementos de la matriz y contarlos. Si se encuentran exactamente dos filtran ese elemento. Después de completar el mapa solo los dos primeros elementos.

var items = [['892', 'NEW', 'blue'], ['341', 'USED', 'red'], ['892', 'NEW', 'yellow'], ['121', 'USED', 'blue'], ['735', 'NEW', 'red'], ['121', 'NEW', 'blue'], ['121', 'USED', 'yellow']],
    hash = Object.create(null),
    result = items
        .filter(function (a) {
            var key = a.slice(0, 2).join('|');
            hash[key] = (hash[key] || 0) + 1;
            return hash[key] === 2;
        })
        .map(function (a) {
            return a.slice(0, 2);
        });

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1
Nina Scholz 28 oct. 2017 a las 07:41

Aquí estaría mi implementación. Creo un conjunto para hacer un seguimiento de los elementos que ya he visto. Si existe en ese conjunto, entonces lo agrego a un conjunto diferente de duplicados. Desafortunadamente, no puede realizar verificaciones de igualdad en los objetos, por lo que primero convierto los elementos en una cadena. Utilizo un Set como mi estructura de datos porque nunca tienen duplicados.

Luego, una vez hecho todo, convierto el conjunto en una matriz y lo mapeo para crear las matrices originales.

const items = [['892','NEW','blue'],
            ['341','USED','red'],
            ['892','NEW','yellow'],
            ['121','USED','blue'],
            ['735','NEW','red'],
            ['121','NEW','blue'],
            ['121','USED','yellow']]

    const duplicates = new Set
    const check = new Set
    items.forEach(([num, status, color]) => {
      let combined = [num, status].join(",")
      if (check.has(combined)) {
        duplicates.add(combined)
      } else {
        check.add(combined)
      }
    })
    const duplicatedArr = Array.from(duplicates).map(strArr => strArr.split(","))
console.log(duplicatedArr)
1
Andrew 28 oct. 2017 a las 07:35
var items = [
  ['892', 'NEW', 'blue'],
  ['341', 'USED', 'red'],
  ['892', 'NEW', 'yellow'],
  ['121', 'USED', 'blue'],
  ['735', 'NEW', 'red'],
  ['121', 'NEW', 'blue'],
  ['121', 'USED', 'yellow']
];

var out = [];
for (i = 0; i < items.length; i++) {
  for (j = i + 1; j < items.length; j++) {
    if (items[i][0] === items[j][0] && items[i][1] === items[j][1]) {
      out.push([items[i][0], items[i][1]]);
    }
  }
}
console.log(out);
0
Akubik 28 oct. 2017 a las 08:15