comparando y clasificando matrices de javascript [cerrado]

Esto puede ser un poco confuso y no estoy seguro de si es posible, pero agradecería cualquier ayuda. Tengo las siguientes matrices (los elementos y la cantidad de listas pueden cambiar, este es solo un ejemplo):

var list_1 = ["A - 2" , "E - 5" , "C - 7"];
var list_2 = ["D - 2" , "A - 2" , "E - 3"];
var list_3 = ["C - 1" , "E - 8" , "A - 7"];

Mi resultado esperado es:

var final = ["A - 2" , "C - 1" , "D - 2" , "E - 3"];

Lo que estoy tratando de hacer:

Estoy tratando de descubrir cómo pasar por cada elemento de la matriz, ver si la letra al comienzo del elemento existe en la matriz anterior y si el número en el elemento es más bajo que el elemento anterior, reemplácelo en el 'final ' lista.

¿Alguna idea o no es posible?

jQuery es aceptable

preguntado el 12 de junio de 12 a las 20:06

¿Por qué "C - 1" viene antes que "A - 2", aunque "A - 2" viene primero en la primera matriz? -

@AndrewPeacock: creo que lo que está diciendo es que el número entero se ordena ASC primero antes de la letra. -

Lo siento, no estoy seguro de ver el problema. Esto es solo una cuestión de escribir un bucle de cópula. ¿Necesitas ayuda con la sintaxis para bucles? ¿O que? -

@AndrewPeacock, actualicé la pregunta. -

@DavidWolever, sí, ese es el problema que tengo. No estoy seguro de cómo comparar artículos con artículos anteriores cuando la colocación del mineral del pedido puede ser diferente. No habrá elementos duplicados, pero ¿cómo encuentro el valor numérico incluido en A cuando A en list_1 aparece primero y en list_2 aparece en segundo lugar? Además, no estoy seguro de cómo lidiar con cadenas con algo como esto. -

5 Respuestas

var list_1 = ["A - 2" , "E - 5" , "C - 7"];
var list_2 = ["D - 2" , "A - 2" , "E - 3"];
var list_3 = ["C - 1" , "E - 8" , "A - 7"];

Primero, fusionas las listas (tercero + segundo + primero):

var list = list_3.concat(list_2).concat(list_1);

Crea un mapa en el que vas a poner el número más bajo para cada letra:

var final_map = {};

Recorra todos los elementos dividiendo cada elemento por letra (parts[0]) y el número (parts[1]).

Obtiene el número más bajo actualmente para la letra dada. Si no hay ningún número o el nuevo número es más bajo que el más bajo actualmente, actualiza el mapa.

list.forEach(function (item) {
  var parts = item.split(' - ');
  var current = final_map[parts[0]];

  if (!current || parts[1] < current) {
    final_map[parts[0]] = parts[1];
  }
});

Finalmente, convierte el mapa en una matriz.

var final = [];
Object.keys(final_map).sort().forEach(function (key) {
  final.push(key + ' - ' + final_map[key]);
});

Respondido 02 Jul 14, 22:07

Tienes que pasar por la matriz manualmente:

var final = [];
$.each(list_1, function(i) { 
  // get each of your elements at index i. Ex list_1[i]
  // do the comparison, and push them to an final
  // possibly split the current element to match the letter and number
})

Respondido el 12 de junio de 12 a las 20:06

Bueno, prácticamente has respondido a tu pregunta tú mismo. Todo lo que necesita ahora es cambiar el algoritmo legible por humanos a JavaScript. Iterar sobre listas con for hasta .length elementos, uso String.substring o expresión regular para dividir datos y guardar el número máximo encontrado en un objeto, donde la letra será la clave y el número, el valor. Luego simplemente cree una matriz final a partir de este objeto en otro for bucle y sort ella, especificando la función personalizada.

Respondido el 12 de junio de 12 a las 20:06

Simplemente crearía una tabla hash en la que la clave será el número entero, mientras que el valor será solo una lista de las letras. Entonces, cuando sea el momento de imprimirlo, simplemente revise la tecla + valor siempre que el valor no se haya utilizado antes. También puede escribir su propia función de clasificación que realmente mirará el número primero

Respondido el 12 de junio de 12 a las 20:06

Usaría una búsqueda para mantener el valor actual e iterar a través de las matrices.

Reorganizando sus listas como tal,

var lists = [["A - 2" , "E - 5" , "C - 7"], 
             ["D - 2" , "A - 2" , "E - 3"], 
             ["C - 1" , "E - 8" , "A - 7"]];

Usando esto,

var f = {}; 
for (var i = 0; i < lists.length; i++) { 
  for (var j = 0; j < lists[i].length; j++) { 
    var s = lists[i][j].split(' - '); 
    var ex = f[s[0]]; 
    if (!ex || ex > s[1]) 
      f[s[0]] = s[1];
  } 
}; 
var a = [];
for (var obj in f) {
  if (f.hasOwnProperty(obj)) { 
    a.push('' + obj + ' - ' + f[obj]);
  }
};

Da

["A - 2", "E - 3", "C - 1", "D - 2"]

Respondido el 12 de junio de 12 a las 20:06

!ex || (ex && ex > s[1]) es el mismo que !ex || ex > s[1] - JK

@JanKuča: tienes razón, lo he corregido. - jose.trow

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.