Перенесите несколько массивов в разные массивы на основе значения индекса элемента в JavaScript.

В настоящее время я работаю с данными JSON, возвращаемыми обратно. В общем, у меня есть несколько массивов, каждый с ключом, основанным на определенном значении в объекте JSON, и все они помещены в объект JavaScript.

Что мне нужно сделать, так это просмотреть каждый массив в объекте и поместить каждый элемент в другой массив на основе его значения индекса. Так, например, obj(name[0]) нужно будет пересадить в массив, скажем, array_0. Остальные массивы должны быть отсортированы таким же образом. Таким образом, obj(other_name[0]) также необходимо поместить в array_0. То же самое должно произойти со всеми другими значениями.

Чтобы проиллюстрировать структуру:

Obj {
   array0:
      [0]AName0
      [1]AName1
      [2]AName2
      [3]AName3
   array1:
      [0]BName0
      [1]BName1
      [2]Bname2
}

Мне нужно, чтобы AName0 находился в том же массиве, что и BName0, AName1 — в том же массиве, что и BName1, и так далее. Мне также нужно динамически создавать эти массивы на лету, поскольку данные будут разными при каждом запуске (что означает различное количество массивов и элементов в массиве).

То, что я пытаюсь сделать, это создать диаграмму динамически. На диаграмме будет несколько наборов данных, и мне нужно динамически создавать каждый набор данных на основе переданных данных.

Вот jsFiddle, показывающий базовую структуру диаграммы и то, что я пытаюсь сделать: https://jsfiddle.net/6m45LL77/

Вот как я получаю данные в массив:

for (var i = 0; i < data.Details.length; ++i) {
                obj[data.Details[i].Name].push("{low: " + data.Details[i].GeolFrom + ", " +
                    "high: " + data.Details[i].GeolTo + ", " +
                    "field: " + data.Details[i].Name + "}, ");

            }

person KOsterhout    schedule 24.09.2015    source источник
comment
На мобильных устройствах прямо сейчас, поэтому мой ответ не может быть подробным, но не могли бы вы использовать для этого метод Array indexOf()?   -  person Morklympious    schedule 25.09.2015


Ответы (1)


Вот что я сделал.

Сначала создайте пример объекта:

var obj = { array0: ['AName0', 'AName1', 'AName2', 'AName3'], array1: ['BName0', 'BName1', 'BName2']};

Затем я создал функцию (наивный подход), которая принимает объект и возвращает объект с новыми массивами.

function transform(obj) {
  var keys = Object.keys(obj);
  var newObj = {};
  for (var k = 0; k < keys.length; k++) {
    var arr = obj[keys[k]];
    for (var i = 0; i < arr.length; i++) {
      var el = arr[i];
      if (el) {
        if (!newObj['array_' + i]) newObj['array_' + i] = [];
        newObj['array_' + i].push(el);
      }
    }
  }
  return newObj;
}

Тестирование с помощью

console.log(transform(obj))

возвращает ожидаемый результат внутри объекта

{ array_0: [ 'AName0', 'BName0' ],
  array_1: [ 'BName1' ],
  array_2: [ 'AName2', 'BName2' ],
  array_3: [ 'AName3' ] }
person manonthemat    schedule 24.09.2015
comment
Вы сэкономили мне часы и часы работы. Это сработало прекрасно, а решение было простым и элегантным. Я очень ценю ваш ответ! - person KOsterhout; 25.09.2015