使用JavaScript将值从数组中拉出并以不同的顺序放入另一个数组中

时间:2016-07-09 02:20:08

标签: javascript arrays

我有一个这样的数组:

var products = [
    ['date1','prod1',1,2],
    ['date2','prod2',3,4],
    ['date3','prod3',5,6],
    ['date4','prod4',7,8],
    ['date5','prod5',9,0]
];

需要将整数拉出数组并将其格式化为:

var newProductsArray = [[1,3,5,7,9],[2,4,6,8,0]];

它需要能够动态扩展,因为products数组将包含更多"列"。

我有这个代码,但它正在向后做,并且无法弄清楚如何循环并只是分解数组。我确信它很简单,我很遗憾。

var metricStartPosition = 2;
var dataSetInnerArray = [];
var dataSetArray = [];

for (var i = 0; i < array.length; i++) {
    for (var k = metricStartPosition; k < array[i].length; k++) {
        dataSetInnerArray.push(array[i][k]);
    };
    dataSetArray.push(dataSetInnerArray);
    dataSetInnerArray = [];
}; 

4 个答案:

答案 0 :(得分:2)

您可以这样做:

&#13;
&#13;
var products = [
      ['date1','prod1',1,2,'a','b'],
      ['date2','prod2',3,4,'c','d'],
      ['date3','prod3',5,6,'e','f'],
      ['date4','prod4',7,8,'g','h'],
      ['date5','prod5',9,0,'i','j']
];
var metricStartPosition = 2;
var newProductsArray = products.reduce(function(output, item) {
  item.slice(metricStartPosition).forEach(function(v, i) {
    (output[i] || (output[i] = [])).push(v);
  });
  return output;
}, []);
console.log(JSON.stringify(newProductsArray));
&#13;
&#13;
&#13;

可以使用任意数量的列。

当然,您可以在.forEach()内使用嵌套的for循环或旧式嵌套.forEach()循环代替.reduce()

答案 1 :(得分:1)

如果我正确地提出了你的问题,那么颠倒两个for循环的顺序就可以了:

var metricStartPosition = 2;
var dataSetInnerArray = [];
var dataSetArray = [];

for (var k = metricStartPosition; k < products[0].length; k++) {
     for (var i = 0; i < products.length; i++) {

        dataSetInnerArray.push(products[i][k]);
    };
    dataSetArray.push(dataSetInnerArray);
    dataSetInnerArray = [];
};

答案 2 :(得分:0)

Related Post

这应该翻转阵列。

var newArray = array[0].map(function(col, i) { 
  return array.map(function(row) { 
    return row[i] 
  })
});

这是一个功能:

function foo (array) {
    var newArray = array[0].map(function(col, i) { 
        return array.map(function(row) { 
            return row[i] 
        })
    });
    return newArray;
}

通过翻转数组我的意思是:

1 2 3      1 4 7
4 5 6  ->  2 5 8
7 8 9      3 6 9

在你的情况下:

var products = [
    ['date1','prod1',1,2],
    ['date2','prod2',3,4],
    ['date3','prod3',5,6],
    ['date4','prod4',7,8],
    ['date5','prod5',9,0]
];

var newProducts = [
    ['date1','date2','date3','date4','date5'],
    ['prod1','prod2','prod3','prod4','prod5'],
    [1,3,5,7,9],
    [2,4,6,8,0]
];

答案 3 :(得分:0)

您可以尝试逐个索引所有列(假设数据的所有行都是逐列的相同类型:

arrayRow = products[0] //['date1','prod1',1,2]
newProductsArray = [];
intIndices = [];
arrayRow.forEach(function(data, i) {
  if (typeof(data) === 'number')
    intIndices.push(i);
});

// intIndices should be [2, 3]

然后遍历整个产品数组以获取所有列:

intIndices.forEach(function (colIndex) {
  innerArray = [];
  for (var i = 0; i < products.length; i++) {
    innerArray.push(products[i][colIndex]);
  }
  newProductsArray.push(innerArray);
});

// you should get nested arrays with all the integer columns
// [ [ 1, 3, 5, 7, 9 ],
//   [ 2, 4, 6, 8, 0 ] ]