Как мы можем объединить многомерный массив с JavaScript или подчеркиванием или lodash - PullRequest
0 голосов
/ 11 июля 2019

Как мы можем объединить и объединить значение ключа этого кода (javascript или undescore или lodash).

Данные массива:

[[
    {
      "Product": "Men's Cut and Sewn",
      "Monday": 13,
      "Tuesday": 1.29,
      "Thursday": 10,
      "Friday": 2,
      "Saturday": 2.1,
      "Sunday": 12
    },
    {
      "Product": "Men's Inner",
      "Monday": 10,
      "Tuesday": 1.29,
      "Wednesday ": 2.6,
      "Thursday": 4.9,
      "Friday": 2,
      "Saturday": 20,
      "Sunday": 12
    }
  ],
  [
    {
      "Product": "Men's Cut and Sewn",
      "Monday": 10,
      "Tuesday": 45,
      "Wednesday": 45,
      "Thursday": 23,
      "Friday": 2,
      "Saturday": 3,
      "Sunday": 2
    },
    {
      "Product": "Men's Inner",
      "Monday": 1,
      "Tuesday": 1,
      "Thursday": 34,
      "Friday": 5,
      "Saturday": 34,
      "Sunday": 34
    }
  ]]

Данные ожидания:

[{
 {
      "Product": "Men's Cut and Sewn",
      "Monday": 23,
      "Tuesday": 2.58,
      "Wednesday": 45,
      "Thursday": 33,
      "Friday": 4,
      "Saturday": 5.1,
      "Sunday": 14
    },
    {
      "Product": "Men's Inner",
      "Monday": 11,
      "Tuesday": 2.29,
      "Wednesday ": 2.6,
      "Thursday": 38.9,
      "Friday": 7,
      "Saturday": 54,
      "Sunday": 46
    }
}] 

Я пытался с этим кодом javaScript

var finalArr = [];
for (var i = 0; i < arr.length - 1; i++) {

  if (i < arr.length - 1 && finalArr.length > 0) {
    var arr1 = finalArr;
    var arr2 = arr[i]
  } else {
    var arr1 = arr[i];
    var arr2 = arr[i + 1];
  }

  for (let obj1 of arr1) {
    var sampleObj = {};

    for (let obj2 of arr2) {
      if (obj1.Product === obj2.Product) {
        sampleObj.Product = obj1.Product;
        for (let day in obj1) {
          if (day !== 'Product') {
            sampleObj[day] = parseInt(obj1[day] + obj2[day]);
          }
        }
      }
    }

    finalArr.push(sampleObj);
  }
}

Это может быть номер массива и некоторый массив необходимо добавить ключ, если он не найден с тем же продуктом(В одном массиве нет ключа 'Monday', но во втором массиве есть ключ 'Monday' с тем же продуктом, поэтому необходимо объединить оба значения понедельника).

enter image description here

this.url = ['assets/sample-dataset.xlsx', 'assets/sheet2.xlsx'];

this.jsonData = XLSX.utils.sheet_to_json(worksheet, { raw: true });

Два листа двух данных массива. Невозможно объединить эти несколько массивов в один массив.jsonData дано два массива с изображением выше.Нужно объединить в один массив [[array1], [array2]]

Ответы [ 3 ]

0 голосов
/ 12 июля 2019

Вы можете использовать lodash для создания функции конвейера с _.flow(). Функция выравнивает вложенные массивы в один массив, группирует элементы по Product, а затем отображает объект groups обратно в массив и объединяет каждую группу в один объект:

const { flow, flatten, partialRight: pr, groupBy, map, mergeWith, isNumber } = _ // replace with imports in your code

const fn = flow(
  flatten, // convert to a single array,
  pr(groupBy, 'Product'), // convert to groups by with the product as key
  pr(map, group => mergeWith({}, ...group, (a, b) => _.isNumber(a) ? _.add(a, b) : undefined)) // combine the items of each group to a single item 
)

const arr = [[{Product:"Men's Cut and Sewn",Monday:13,Tuesday:1.29,Thursday:10,Friday:2,Saturday:2.1,Sunday:12},{Product:"Men's Inner",Monday:10,Tuesday:1.29,"Wednesday":2.6,Thursday:4.9,Friday:2,Saturday:20,Sunday:12}],[{Product:"Men's Cut and Sewn",Monday:10,Tuesday:45,Wednesday:45,Thursday:23,Friday:2,Saturday:3,Sunday:2},{Product:"Men's Inner",Monday:1,Tuesday:1,Thursday:34,Friday:5,Saturday:34,Sunday:34}]]

const result = fn(arr)


console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.14/lodash.js"></script>

И более краткая версия с использованием lodash / fp:

const { flow, flatten, groupBy, map, mergeAllWith, isNumber } = _ // replace with imports in your code

const fn = flow(
  flatten, // convert to a single array,
  groupBy('Product'), // convert to groups by with the product as key
  map(mergeAllWith((a, b) => _.isNumber(a) ? _.add(a, b) : undefined)) // combine the items of each group to a single item 
)

const arr = [[{Product:"Men's Cut and Sewn",Monday:13,Tuesday:1.29,Thursday:10,Friday:2,Saturday:2.1,Sunday:12},{Product:"Men's Inner",Monday:10,Tuesday:1.29,"Wednesday":2.6,Thursday:4.9,Friday:2,Saturday:20,Sunday:12}],[{Product:"Men's Cut and Sewn",Monday:10,Tuesday:45,Wednesday:45,Thursday:23,Friday:2,Saturday:3,Sunday:2},{Product:"Men's Inner",Monday:1,Tuesday:1,Thursday:34,Friday:5,Saturday:34,Sunday:34}]]

const result = fn(arr)


console.log(result)
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
0 голосов
/ 12 июля 2019

const arr = [[{Product:"Men's Cut and Sewn",Monday:13,Tuesday:1.29,Thursday:10,Friday:2,Saturday:2.1,Sunday:12},{Product:"Men's Inner",Monday:10,Tuesday:1.29,"Wednesday":2.6,Thursday:4.9,Friday:2,Saturday:20,Sunday:12}],[{Product:"Men's Cut and Sewn",Monday:10,Tuesday:45,Wednesday:45,Thursday:23,Friday:2,Saturday:3,Sunday:2},{Product:"Men's Inner",Monday:1,Tuesday:1,Thursday:34,Friday:5,Saturday:34,Sunday:34}]],
    group = { };

arr.forEach(inner => {
  inner.forEach(({ Product, ...days }) => {
    group[Product] = group[Product] || { Product };
    for (const key in days) {
      if(group[Product][key])
        group[Product][key] += days[key];
      else 
        group[Product][key] = days[key];
    }
  })
})

console.log(Object.values(group))
0 голосов
/ 11 июля 2019

Вы можете использовать вложенные forEach.Конечная цель - создать объект-накопитель со всеми Product в качестве ключа и значениями, которые вам нужны в выходном массиве в качестве его значения.Создайте defaultObj со всеми днями недели в качестве ключей и 0 в качестве значения.В цикле вложенных массивов деструктурирует , чтобы получить Product и rest клавиш days в качестве отдельного объекта.Переберите клавиши days и обновите соответствующие значения Product

const arr = [[{Product:"Men's Cut and Sewn",Monday:13,Tuesday:1.29,Thursday:10,Friday:2,Saturday:2.1,Sunday:12},{Product:"Men's Inner",Monday:10,Tuesday:1.29,"Wednesday":2.6,Thursday:4.9,Friday:2,Saturday:20,Sunday:12}],[{Product:"Men's Cut and Sewn",Monday:10,Tuesday:45,Wednesday:45,Thursday:23,Friday:2,Saturday:3,Sunday:2},{Product:"Men's Inner",Monday:1,Tuesday:1,Thursday:34,Friday:5,Saturday:34,Sunday:34}]],
    defaultObj = { Monday: 0, Tuesday: 0, Wednesday: 0, Thursday: 0, Friday: 0, Saturday: 0, Sunday: 0 },
    group = { };

arr.forEach(inner => {
  inner.forEach(({ Product, ...days }) => {
    group[Product] = group[Product] || { Product, ...defaultObj };
    for (const key in days)
      group[Product][key] += days[key];
  })
})

console.log(Object.values(group))

Вот как будет выглядеть group объект

{
  "Men's Cut and Sewn": {
    "Product": "Men's Cut and Sewn",
    "Monday": 23,
    "Tuesday": 46.29,
    "Wednesday": 45,
    "Thursday": 33,
    "Friday": 4,
    "Saturday": 5.1,
    "Sunday": 14
  },
  "Men's Inner": {
    "Product": "Men's Inner",
    "Monday": 11,
    "Tuesday": 2.29,
    "Wednesday": 2.6,
    "Thursday": 38.9,
    "Friday": 7,
    "Saturday": 54,
    "Sunday": 46
  }
}

Вы можете использовать Object.values(), чтобы получитьзначения этого объекта в виде массива


Приведенный выше код добавит значение для всех дней недели.Допустим, Men's Cut and Sewn product не имеет значения для Monday ни в одном из массивов, и вам не нужен ключ Monday с 0 в качестве значения в выходных данных.Вместо использования defaultObj вы можете добавить еще if-else, чтобы проверить, был ли уже добавлен день.

const arr = [[{Product:"Men's Cut and Sewn",Monday:13,Tuesday:1.29,Thursday:10,Friday:2,Saturday:2.1,Sunday:12},{Product:"Men's Inner",Monday:10,Tuesday:1.29,"Wednesday":2.6,Thursday:4.9,Friday:2,Saturday:20,Sunday:12}],[{Product:"Men's Cut and Sewn",Monday:10,Tuesday:45,Wednesday:45,Thursday:23,Friday:2,Saturday:3,Sunday:2},{Product:"Men's Inner",Monday:1,Tuesday:1,Thursday:34,Friday:5,Saturday:34,Sunday:34}]],
    group = { };

arr.forEach(inner => {
  inner.forEach(({ Product, ...days }) => {
    group[Product] = group[Product] || { Product };
    for (const key in days) {
      if(group[Product][key])
        group[Product][key] += days[key];
      else 
        group[Product][key] = days[key];
    }
  })
})

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