【问题标题】:How do i split an array per column for all columns? (JavaScript)如何为所有列拆分每列的数组? (JavaScript)
【发布时间】:2018-02-21 20:59:20
【问题描述】:

你好 JavaScript 同行,

我有一个从 csv 文件中的数据创建的数组,如下所示:

每个数组索引,例如 array[0] 是在这种情况下有 87 个的标题。该数组中的每个其他数组都是行。

我需要获取该数据并在列之间拆分它

以下代码就是这样做的,但只针对第一列:

      var specialCounter = 0;
        for(var j = 1; j<vm.lines.length; j++){
            vm.columns.push(vm.lines[j][0]);

            if(specialCounter >= vm.lines[j][0].length)
                specialCounter = 0;
            else
                specialCounter++;
        }

        vm.columnData.columnData= vm.columns;

        console.log(vm.columnData);

这是它吐出来的数组。

我该如何对这个数组中的所有列执行此操作?

也许有像vm.dataPerColumn = [{column1: [...], column2: [...], etc...]这样的结构

【问题讨论】:

  • 如果你那样做,你不是把事情复杂化了吗?你已经知道你想要哪一列,所以写column[0][15] 将引用columnData[0]["column16"]
  • @Pavlo 我需要将它放在 for 循环中,因为一旦我获得每列的所有数据,我需要找到每个不同的值以及它在该列中出现的次数
  • 你确定 array[0] 不是所有的标题吗?从你的照片看我是这样的

标签: javascript arrays algorithm arraylist


【解决方案1】:

Reduce 数组,forEach 子数组检查键是否存在,如果不存在则在结果对象(r)上创建键。将当前项推到键上:

var arr = [['h1', 1, 2, 3], ['h2', 4 , 5 , 6], ['h3', 7, 8, 9]];

var result = arr.reduce(function(r, a) {
  a.forEach(function(s, i) {
    var key = i === 0 ? 'headers' : 'column' + i;
    
    r[key] || (r[key] = []); // if key not found on result object, add the key with empty array as the value
    
    r[key].push(s);
  });
  
  return r;
}, {});

console.log(result);

【讨论】:

  • 当我运行您的代码时,我看到数组中缺少数据?有 472 行,当我通过你的 sn-p 运行数组时,结果只有数组中的 465 个项目而不是完整的 472?这是为什么呢?
  • 创建一个codepen(或类似的),我来看看。
【解决方案2】:

从阅读描述和图片来看,标题似乎在array[0]

const vm = {};
vm.lines = [["$", "house", "car"],[5, 10, 15],[25,35,45]]; 

const headers = vm.lines[0];
const data = vm.lines.slice(1);

const columns = data.reduce((newColumns, row) => {
    for(let i=0;i<row.length;i++){
        if(newColumns.length-1 < i){ //first column;
            newColumns.push([]);
        }
        newColumns[i].push(row[i]);
    }
    return newColumns;
}, []);

const columnsWithHeaders = headers.map((header, index) => ({[header]:columns[index]}));

console.log(columnsWithHeaders);

您请求了column1、column2等,但是当您已经有一个数组时它并没有真正意义,所以我将标题名称与相应的列放在一起,然后您可以直接引用它

我所做的是将标题和数据分开。这样你就不用担心第一行了,

然后我将行转换为列,之后您可以浏览标题并将列数组添加到每个标题。

【讨论】:

  • 当我运行您的代码时,我看到数组中缺少数据?有 472 行,当我通过你的 sn-p 运行数组时,结果只有数组中的 465 个项目而不是完整的 472?这是为什么呢?
  • 可能是slice方法,没有数据的时候很难说
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多