Как преобразовать массив в словарь в Javascript (также изменить порядок столбцов в строки)? - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть следующий массив массивов:

[
  [o1, c1, h1, l1 ,t1],
  [o2, c2, h2, l2, t2],
  ...
  [oN, cN, hN, lN, tN]
]

Мне нужно преобразовать это в объект, который структурирован следующим образом:

{
  open:   [o1,o2,o3,o4,o5,o6,o7,o8, ... oN],
  close:  [c1,c2,c3,c4,c5,c6,c7,c8, ... cN],
  high:   [h1,h2,h3,h4,h5,h6,h7,h8, ... hN],
  low:    [l1,l2,l3,l4,l5,l6,l7,l8, ... lN],
  time:   [t1,t2,t3,t4,t5,t6,t7,t8, ... tN]
}

Таким образом, это означает, что мне нужно решить еще одну проблему - реорганизовать столбцы в строки.

Ниже приведен код, который работает для меня:

function convertData(rawDataArray) {
  [open, close, high, low, timesignature] = [
    [],
    [],
    [],
    [],
    []
  ];
  var arrayLength = rawDataArray.length;
  for (var i = 0; i < arrayLength; i++) {
    open.push(rawDataArray[i][1])
    close.push(rawDataArray[i][2])
    high.push(rawDataArray[i][3])
    low.push(rawDataArray[i][4])
    timesignature.push(rawDataArray[i][0])
  }
  return {
  	open: open,
    close: close,
    high: high,
    low: low,
    timeSignature: timesignature
  }
}

Однако мое решение кажется мне неуклюжим и не очень элегантным.Мне любопытно узнать, как написать это более эффективно.

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Полагаю, под элегантностью вы подразумеваете более легкий для чтения код и не обязательно более быстрый с точки зрения производительности.Вот где map() пригодится, потому что сокращает неуклюжий цикл for в одну строку.

function convertData(rawDataArray) {
    return {
        open: rawDataArray.map(i=>i[0]),
        close: rawDataArray.map(i=>i[1]),
        high: rawDataArray.map(i=>i[2]),
        low: rawDataArray.map(i=>i[3]),
        timeSignature: rawDataArray.map(i=>i[4])
    }
}
0 голосов
/ 21 декабря 2018

Вы можете взять ключи и использовать их как часть средства доступа к свойству для нажатия значения.

function convertData(rawDataArray) {
    var keys = ['open', 'close', 'high', 'low', 'time'],
        result = Object.assign(...keys.map(k => ({ [k]: [] })));

    rawDataArray.forEach(a => keys.forEach((k, i) => result[k].push(a[i])));
    return result;
}
0 голосов
/ 21 декабря 2018

let row =[
  ["o1", "c1", "h1", "l1","t1"],
  ["o2", "c2", "h2", "l2", "t2"]
]
const extractIndex = (ind,data)=> data.map(e=>e[ind]) 
const convertDataNew = (rawDataArray)=> {
  return {
    open: extractIndex(0,rawDataArray),
    close: extractIndex(1,rawDataArray),
    high: extractIndex(2,rawDataArray),
    low: extractIndex(3,rawDataArray),
    timeSignature: extractIndex(4,rawDataArray)
  }

}


console.log(convertDataNew(row))
...