根据数组的第一个值拆分数组

时间:2015-12-10 06:08:08

标签: javascript arrays

希望你理解我的问题。 让我们说我有这个数组:

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

我想要基于第一个值的新数组,如下所示:

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

它们是三个数组,因为有三个数字1和2以及3.如果有更多数字,则应该出现更多数组。

非常感谢。

6 个答案:

答案 0 :(得分:3)

您可以创建一个新对象,其中键将是索引号(每个当前数组值的第一个索引),值将是相关数字(第二个索引)。

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));

答案 1 :(得分:0)

检查此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 );

答案 2 :(得分:0)

我同意其他的回答者说,一个对象包含一组数组,这些数组的键对应于你要分组的数字,这是要走的路。这是使用reduce的解决方案。它传入一个空对象作为初始值。

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

输出

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

然后,您可以使用方括号表示法获取数据。

obj['1'][0] // 0.3

答案 3 :(得分:0)

检查this

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);

答案 4 :(得分:0)

如果第一个元素总是非负数,那么这样的东西也适合你:

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/

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

输出:[ [ 0.3, 0.5 ], [ 0.6, 0.7 ], [ 0.8, 0.9 ] ]

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

输出:[ [ 0.3, 0.5 ], [ 0.7, 0.6 ], [ 0.8, 0.9 ], [ 0.6, 0.2 ] ]

答案 5 :(得分:0)

只需使用Array.prototype.reduce()的值来比较该组。

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>');