Как назвать значения в массиве по значениям в другом массиве? - PullRequest
1 голос
/ 24 июня 2019

У меня есть два массива:

Первый содержит уникальные имена полей во вложенном массиве:

[0][0]:Name1
[0][1]:Name2
[0][2]:Name3
etc.

Второй содержит несколько элементов со значениями во вложенном массиве, например:

[0][0] XYZ
[0][1] XYZA
[0][2] XYZ2
[1][0] XYZaa
[1][1] XYZas
[1][2] XYA
etc

Что я хочу сделать, так это слить и назвать это так:

[0] Name1: XYZ
[0] Name2: XYZA
[0] Name3: XYZ2
[1] Name1: XYZaa
[1] Name2: XYZas
[1] Name3: XYA

Для этого я сначала попытался сделать следующее:

var mergedArr = name.concat(data);

Это прекрасно работает, однако я считаю, что я также могу использовать lodash, чтобы приблизиться к тому, что я хочу:

_.merge(name, data)

и должно работать нормально.

Я пытался назвать его, используя

_.zipObject

Все же это не работает так, как я хотел бы

Я пробовал несколько вариантов с zip, zipObject, но ни один из них не дал мне ожидаемого результата.

Edit1: как я создал массивы:

    $("#T1020 tr").each(function(x, z){
    name[x] = [];
    $(this).children('th').each(function(xx, zz){
           name[x][xx] = $(this).text();

      });

})

    $("#T1020 tr").each(function(i, v){
        data[i] = [];
        $(this).children('td').each(function(ii, vv){
            data[i][ii] = $(this).text();

      });
   })

Ответы [ 2 ]

1 голос
/ 24 июня 2019

Если я правильно понимаю ваш вопрос, вы хотите сжать array1 и array2 в один массив, где:

  • каждый элемент массива результатов является объектом
  • ключи каждого объекта имеют значения array1[0] и
  • значения каждого ключа, соответствующие вложенному массиву array2

Производить следующее:

[
 {
  "name1": "xyz",
  "name2": "xyza",
  "name3": "xyz2"
 },
 {
  "name1": "xyzaa",
  "name2": "xyzas",
  "name3": "xya"
 }
]

Это может быть достигнуто без lodash; сначала сопоставьте каждый элемент array2 с помощью функции, где array1[0] сводится к объекту. Сокращенный объект состоит из ключа, который является текущим элементом сокращения, и значения, которое берется из индексированного значения текущего элемента карты:

const array1 = [
  ['name1', 'name2', 'name3']
]

const array2 = [
  ['xyz', 'xyza', 'xyz2'],
  ['xyzaa', 'xyzas', 'xya']
]


const result = array2.map((item) => {

  /* Reduce items of array1[0] to an object
  that corresponds to current item of array2 */
  return array1[0].reduce((obj, value, index) => {

    return { ...obj,
      [value]: item[index]
    };
  }, {});

});

console.log(JSON.stringify(result, null, ' '));
0 голосов
/ 24 июня 2019

Выполните итерацию values (ваш array2) и возьмите подмассив из ключей (array), используя текущий индекс и оператор %.Это будет гарантировать, что если ключи взяты циклически (см. Пример с keys2 и values2).Преобразовать в объект с помощью _.zipObject:

const fn = (keys, values) => values.map((v, i) => _.zipObject(keys[i % keys.length], v))

const keys1 = [['name1', 'name2', 'name3']]
const values1 = [['xyz', 'xyza', 'xyz2'], ['xyzaa', 'xyzas', 'xya']]
const keys2 = [['name1', 'name2', 'name3'], ['name11', 'name12', 'name13']]
const values2 = [['xyz', 'xyza', 'xyz2'], ['xyzaa', 'xyzas', 'xya'], ['abc', 'def', 'hij']]

console.log(fn(keys1, values1))
console.log(fn(keys2, values2))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
...