Преобразование массива массивов как элементов в объект с объектами в качестве элементов - PullRequest
0 голосов
/ 03 марта 2019

У меня есть такой массив:

var arr = [
    ['a1','b1','c1','d1'],
    ['a1','e1','i1','j1'],
    ['a1','f1','k1','l1'],
    ['a1','g1','m1','n1'],
    ['a1','h1','o1','p1'],
    ['a2','b2','c2','d2'],
    ['a2','e2','i2','j2'],
    ['a2','f2','k2','l2'],
    ['a2','g2','m2','n2'],
    ['a2','h2','o2','p2']
];

, и я хочу преобразовать его в объект, подобный этому:

var converted_arr = {
    'a1':{
        'b1':['c1','d1'],
        'e1':['i1','j1'],
        'f1':['k1','l1'],
        'g1':['m1','n1'],
        'h1':['o1','p1'],
    },
    'a2':{
        'b2':['c2','d2'],
        'e2':['i2','j2'],
        'f2':['k2','l2'],
        'g2':['m2','n2'],
        'h2':['o2','p2'],
    }
};

Как вы можете видеть все элементы первогомассив (arr) - это массивы, и его элементы в этих массивах - это строки или числа или оба.
Один из примеров, которые я пробовал, следующий:

var obj = {};
$.each(arr,function(a)
{
    obj[a[0]][a[1]] = a.slice(2);
});

Но он ничего не дает.
Кто-нибудь может мне помочь?

Ответы [ 4 ]

0 голосов
/ 03 марта 2019

Вы на правильном пути.Просто использование функции было неправильным.Я повторно использовал код и обновил его, чтобы он работал нормально.Для функции $ .each первое значение - это индекс ( docs ), который был основной причиной ошибки.

Я обновил код, и он отлично работает.

var arr = [
    ['a1','b1','c1','d1'],
    ['a1','e1','i1','j1'],
    ['a1','f1','k1','l1'],
    ['a1','g1','m1','n1'],
    ['a1','h1','o1','p1'],
    ['a2','b2','c2','d2'],
    ['a2','e2','i2','j2'],
    ['a2','f2','k2','l2'],
    ['a2','g2','m2','n2'],
    ['a2','h2','o2','p2']
];
obj = {}
$.each(arr,function(index)
{
    obj[arr[index][0]] = obj[arr[index][0]] || {}
    obj[arr[index][0]][arr[index][1]] = arr[index].slice(2);
});
console.log(obj)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Примечание: Решение является специфическим для вышеуказанного требования.Тем не менее, его можно обобщить и с помощью рекурсии.

Надеюсь, это поможет.Возврат для любых сомнений / разъяснений.

0 голосов
/ 03 марта 2019

Вы можете использовать reduce и деструктурирование , например:

var arr = [
    ['a1','b1','c1','d1'],
    ['a1','e1','i1','j1'],
    ['a1','f1','k1','l1'],
    ['a1','g1','m1','n1'],
    ['a1','h1','o1','p1'],
    ['a2','b2','c2','d2'],
    ['a2','e2','i2','j2'],
    ['a2','f2','k2','l2'],
    ['a2','g2','m2','n2'],
    ['a2','h2','o2','p2']
];

const newArray = arr.reduce((acc, [key, key2, ...rest]) => {
  acc[key] = acc[key] || {};
  acc[key][key2] = rest
  return acc;
}, {})

console.log(newArray)
0 голосов
/ 03 марта 2019

Вот простой пример работы со списком списков (в соответствии с вашими примерами) с минимальным размером листовых массивов, передаваемых в качестве параметра (в вашем случае равным 2).

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

var arr = [
    ['a1','b1','c1','d1'],
    ['a1','e1','i1','j1'],
    ['a1','f1','k1','l1'],
    ['a1','g1','m1','n1'],
    ['a1','h1','o1','p1'],
    ['a2','b2','c2','d2'],
    ['a2','e2','i2','j2'],
    ['a2','f2','k2','l2'],
    ['a2','g2','m2','n2'],
    ['a2','h2','o2','p2']
];

console.log(transform(arr, 2));

function transform(input, minSize) {

  return normalize(map(input, {}), minSize);

  function map(input, result) {
    for (var ii = 0; ii < input.length; ii++) {
      var row = input[ii];
      if (row.length == 0) {
        continue;
      }

      var first = row[0];
      var list = result[first] || (result[first] = []);
      list.push(cdr(row));
    }
    return result;
  }

  function normalize(result, minSize) {
    for (var key in result) {
      var list = result[key];
      if (list.length == 0) {
        continue;
      }
      var first = list[0];
      if (list.length == 1 && first.length <= minSize) {
        result[key] = first;
        continue;
      }
      result[key] = transform(list, minSize);
    }
    return result;
  }

  function cdr(list) {
    var result = [];
    for (var ii = 1; ii < list.length; ii++) {
      result.push(list[ii]);
    }
    return result;
  }
}
0 голосов
/ 03 марта 2019

Используя Reduce в библиотеке Lodash, вы можете сделать следующее, где arr - ваш входной массив.

_.reduce(arr, function(acc, val) { var k1 = val[0], k2 = val[1], val = val.slice(2); acc[k1] = acc[k1] || {}; acc[k1][k2] = val; return acc; }, {});

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...