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] + " ";
}
here.innerHTML += "<br />";
} // end of setValues function
Respuestas
2 para la respuesta № 1var 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