/ / ¿Cómo podría devolver múltiples matrices con valores iguales de una matriz más grande con valores mixtos? - JavaScript, matrices, clasificación, coincidencia de cadenas, arrastre de matriz

¿Cómo puedo devolver múltiples matrices con valores iguales de una matriz más grande con valores mixtos? - javascript, matrices, clasificación, coincidencia de cadenas, matriz-push

Tengo una matriz que después de ser ordenado aparece así:

var arr = ["a", "a", "b", "b", "b", "b", "c", "c", "c"];


Hay 2 "a" Cuerdas, 4 "b" Cuerdas y 3 "c" Instrumentos de cuerda.

Estoy tratando de devolver 3 matrices separadas, devolviéndolas una a la vez desde un bucle, que contiene solamente valores coincidentes Entonces, en la primera iteración, la matriz devuelta aparecería como newArr = ["a", "a"], el segundo como newArr = ["b", "b", "b", "b"] y en la tercera iteración como newArr = ["c", "c", "c"].

Sin embargo, esta es una pequeña matriz de valores predefinidos, y necesito un algoritmo que pueda realizar la misma operación en una matriz de desconocido Talla, desconocido elementos, y con un desconocido Número de elementos similares. (y tenga en cuenta que la matriz ya está ordenada para empezar, en este contexto)

Aquí está mi código loco que muestra algunos resultados inusuales e incorrectos:

var arr = ["a", "a", "b", "b", "b", "b", "c", "c", "c"];

for(var index = 0; index < arr.length; index++)
{
var test = "";
var newArr = []; // resets the new array upon each iteration
var str = arr[index]; // initialized as the next unique index-value

for(var i = index; i < arr.length; i++)
{
if(arr[i] == str)
{
newArr.push(arr[k]);
test += arr[i] + " ";
}
else
{
index = i; // changing the outer loop variable
break; // exiting the inner loop
}
} // end of inner loop

window.alert(test);
setValues(newArr);

} // end of outer loop

function setValues(arrSorted)
{
var here = document.getElementById("here");

for(var i = 0; i < arrSorted.length; i++)
{
here.innerHTML += arrSorted[i] + "&nbsp;";
}

here.innerHTML += "<br />";

} // end of setValues function

Respuestas

2 para la respuesta № 1
var arr = ["a", "a", "b", "b", "b", "b", "c", "c", "c"];
var arrays = {};
for (var i=0;i<arr.length;i++) {
if (!arrays[arr[i]]) arrays[arr[i]] = [];
arrays[arr[i]].push(arr[i]);
}

esto te dará el equivalente de

arrays = {};
arrays["a"] = ["a","a"];
arrays["b"] = ["b","b","b","b","b"];
arrays["c"] = ["c","c","c"];

1 para la respuesta № 2

Puede usar una función como esta para dividir la matriz en varias matrices:

function divide(arr) {

var subArrays = [];
var current = null;
var subArray = null;

for (var i = 0; i < arr.length; i++) {
if (arr[i] != current) {
if (subArray != null) subArrays.push(subArray);
current = arr[i];
subArray = [];
}
subArray.push(arr[i]);
}
if (subArray != null) subArrays.push(subArray);
return subArrays;
}

Manifestación: http://jsfiddle.net/Guffa/d8CBD/


1 para la respuesta № 3

Así es como lo haría:

var arr = ["a", "a", "b", "b", "b", "b", "c", "c", "c"];

var out = [], prev;
for (var i = 0, j = 0, len = arr.length; i < len; i++) {
if (arr[i] !== prev || !out.length) {
out[j++] = [prev = arr[i]];
} else {
out[j - 1].push(prev);
}
}

//out -> [["a","a"],["b","b","b"],["c","c","c"]]

Manifestación

Nota: el || !out.length la verificación es solo manejar matrices que comienzan con undefined correctamente, pero siéntase libre de eliminarlo si este nunca será el caso