Espero que entiendas mi pregunta. Digamos que tengo esta matriz:

[[1, 0.3], [1, 0.5], [2, 0.6], [2, 0.7], [3, 0.8], [3, 0.9]]

Quiero nuevas matrices basadas en el primer valor como este:

[0.3, 0.5]
[0.6, 0.7]
[0.8, 0.9]

Son tres matrices porque hay tres números 1 y 2 y 3. Si hay más números, entonces deberían aparecer más matrices.

Muchas gracias.

1
shobokshy 10 dic. 2015 a las 09:08

6 respuestas

La mejor respuesta

Puede crear un nuevo objeto donde la clave será el número de índice (primer índice de cada valor de matriz actual) y el valor serán los números relevantes (el segundo índice).

var arr = [[1, 0.3], [1, 0.5], [2, 0.6], [2, 0.7], [3, 0.8], [3, 0.9]];

var newObj = {};

arr.map(function(item){
	if(newObj[item[0]])
  	   newObj[item[0]].push(item[1]);
        else
  	   newObj[item[0]] = [item[1]];
});

console.log('New object: ' + JSON.stringify(newObj));

// if you insist on creating an array

var newArr = [];
var cnt = 0;
for(var item in newObj)
{
   if(newObj.hasOwnProperty(item))
   {
      newArr[cnt] = newObj[item];
      cnt++;
   }
}

console.log('New array: ' + JSON.stringify(newArr));
3
Amir Popovich 10 dic. 2015 a las 06:30

Estoy de acuerdo con los otros respondedores en que un objeto que contiene un conjunto de matrices con claves correspondientes al número que desea agrupar es el camino a seguir. Aquí hay una solución usando reduce. Pasa en un objeto vacío como valor inicial.

var obj = arr.reduce(function (p, c) {

  // for each of the nested arrays we iterate over
  // set the key as the "groupBy" number
  // (the first element)
  var key = c[0];

  // if that key doesn't exist in the object (p)
  // that we've passed in
  // create it and assign a new array to it
  p[key] = p[key] || [];

  // push the second element of the array to the
  // array in the object
  p[key].push(c[1]);

  // pass the object in to the next iteration
  // of the reduce callback
  return p;

}, {});

Demo

Salida

{
  "1": [ 0.3, 0.5 ],
  "2": [ 0.6, 0.7 ],
  "3": [ 0.8, 0.9 ]
}

Luego puede obtener los datos utilizando la notación de corchetes.

obj['1'][0] // 0.3
0
Andy 10 dic. 2015 a las 06:34

Verifique esto:

var target = [[1, 0.3], [1, 0.5], [2, 0.6], [2, 0.7], [3, 0.8], [3, 0.9]];
var result = [];
for (var count=0; count<target.length; count++){
  var arrayCount = [];
  for (var elem in target) {
    if (target[elem][0] === count) {
        arrayCount.push(target[elem][1]);
    }
  }
  if (arrayCount.length !== 0) {
    result.push(arrayCount);
  }
}
//This is the result, i.e.: [[0.3, 0.5], [0.6, 0.7], [0.8, 0.9]]
console.log(result);
0
sunzhida 10 dic. 2015 a las 06:37

Si el primer elemento es siempre un número no negativo, algo como esto también funciona para usted:

function merge(arr){
  var tmp = [];
  arr.map(function(item){
    var key = item[0], value = item[1];
    if(!tmp[key]){
      tmp[key] = [value];
    }
    else{
      tmp[key].push(value);
    }
  });

  return tmp.filter(function(item){
    return item ? true : false;
  });
}

http://jsfiddle.net/ndaidong/f1g882gy/

Entrada: [[1, 0.3], [1, 0.5], [2, 0.6], [2, 0.7], [3, 0.8], [3, 0.9]];

Salida: [ [ 0.3, 0.5 ], [ 0.6, 0.7 ], [ 0.8, 0.9 ] ]

Entrada: [[1, 0.3], [4, 0.6], [3, 0.8], [4, 0.2], [1, 0.5], [2, 0.7], [2, 0.6], [3, 0.9]];

Salida: [ [ 0.3, 0.5 ], [ 0.7, 0.6 ], [ 0.8, 0.9 ], [ 0.6, 0.2 ] ]

0
Dong Nguyen 10 dic. 2015 a las 06:46

Simplemente use Array.prototype.reduce() con un valor para comparar el grupo.

var data = [[1, 0.3], [1, 0.5], [2, 0.6], [2, 0.7], [3, 0.8], [3, 0.9]],
    array = [];

data.reduce(function (r, a) {
    if (r === a[0]) {
        array[array.length - 1].push(a[1]);
    } else {
        array.push([a[1]]);
    }
    return a[0];
}, null);

document.write('<pre>' + JSON.stringify(array, 0, 4) + '</pre>');
0
Nina Scholz 10 dic. 2015 a las 07:32

Compruebe esto fiddle

var arr = [[1, 0.3], [1, 0.5], [2, 0.6], [2, 0.7], [3, 0.8], [3, 0.9]];
var outputObj = {};
var outputArr = [];
for ( var counter = 0; counter < arr.length; counter++ )
{
   if ( !outputObj[ arr[ counter ][ 0 ] ] )
   {
      outputObj[ arr[ counter ][ 0 ] ] = [];
   }
   outputObj[ arr[ counter ][ 0 ] ].push( arr[ counter ][ 1 ] );
}
for( var id in outputObj )
{
   outputArr.push( outputObj[ id ] );
}
console.log( outputArr );
0
gurvinder372 10 dic. 2015 a las 06:16