сравнить вложенные массивы объектов - PullRequest
1 голос
/ 17 марта 2020

Не могли бы вы помочь мне, пожалуйста? Мне нужно сравнить и рассчитать процент от разницы между значениями и вернуть массив. Мне нужно сравнить массивы, добраться до объектов с именем и значением и посчитать процент. Предположим, что для первого элемента в массиве {имя: 'Имя 1', значение: 1945}, go во второй элемент, чтобы найти там {имя: 'Имя 1', значение: 699}. Процент для 1945 года будет 100, для 699 - 36. Я запутался во вложении ((

//input data
const data = [
  {
    _id: "0090908",
    groups: [
      {
        _id: "24424",
        name: "Group 1",
        group_type: "group_1",
        items: [
          { name: "Name 1", value: 1945 },
          { name: "Name 2", value: 0 },
          { name: "Name 3", value: 39 },
        ],
      },
      {
        _id: "23030",
        name: "Group 2",
        group_type: "group_2",
        items: [
          { name: "Name 4", value: 67 },
          { name: "Name 5", value: 123 },
          { name: "Name 6", value: 13 },
        ],
      },
    ]
  },
  {
    _id: "00390395",
    groups: [
      {
        _id: "837583",
        name: "Group 1",
        group_type: "group_1",
        items: [
          { name: "Name 1", value: 699 },
          { name: "Name 2", value: 55},
          { name: "Name 3", value: 39 },
        ],
      },
      {
        _id: "8989305",
        name: "Group 2",
        group_type: "group_2",
        items: [
          { name: "Name 4", value: 998 },
          { name: "Name 5", value: 12 },
          { name: "Name 6", value: 485 },
        ],
      },
    ]
  }
];

//result data
const result = [
  {
    _id: "0090908",
    groups: [
      {
        _id: "24424",
        name: "Group 1",
        group_type: "group_1",
        items: [
          { name: "Name 1", value: 1945, percent: 100, best: true },
          { name: "Name 2", value: 0, percent: 0, best: false },
          { name: "Name 3", value: 39, percent: 100, best: true },
        ],
      },
      {
        _id: "23030",
        name: "Group 2",
        group_type: "group_2",
        items: [
          { name: "Name 4", value: 67, percent: 6, best: false },
          { name: "Name 5", value: 123, percent: 100, best: true },
          { name: "Name 6", value: 13, percent: 3, best: true },
        ],
      },
    ]
  },
  {
    _id: "00390395",
    groups: [
      {
        _id: "837583",
        name: "Group 1",
        group_type: "group_1",
        items: [
          { name: "Name 1", value: 699, percent: 36, best: false },
          { name: "Name 2", value: 55, percent: 100, best: true},
          { name: "Name 3", value: 39, percent: 100, best: true },
        ],
      },
      {
        _id: "8989305",
        name: "Group 2",
        group_type: "group_2",
        items: [
          { name: "Name 4", value: 998, percent: 100, best: true },
          { name: "Name 5", value: 12, percent: 9, best: false },
          { name: "Name 6", value: 485, percent: 100, best: true },
        ],
      },
    ]
  }
];

1 Ответ

1 голос
/ 17 марта 2020

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

var best = {}; // Our database of higher values

function checkLargest(data) {
  if (!data) return;
  // If is iterable perform the function on each element
  if (Symbol.iterator in Object(data)) for (var el of data) checkLargest(el);
  if (data.name && data.value !== undefined)
    if (!best[data.name] || best[data.name] < data.value)
      best[data.name] = data.value;
  checkLargest(data.groups); // If doesn't exist will return
  checkLargest(data.items);
}

function placePercentages(data) {
  if (!data) return;
  if (Symbol.iterator in Object(data)) for (var el of data) placePercentages(el);
  if (data.name && data.value !== undefined) {
    var higher = best[data.name];
    data.percent = Math.round(data.value / higher * 100);
    data.best = (higher == data.value);
  }
  placePercentages(data.groups);
  placePercentages(data.items);
}

const d = [
  {
    _id: "0090908",
    groups: [
      {
        _id: "24424",
        name: "Group 1",
        group_type: "group_1",
        items: [
          { name: "Name 1", value: 1945 },
          { name: "Name 2", value: 0 },
          { name: "Name 3", value: 39 },
        ],
      },
      {
        _id: "23030",
        name: "Group 2",
        group_type: "group_2",
        items: [
          { name: "Name 4", value: 67 },
          { name: "Name 5", value: 123 },
          { name: "Name 6", value: 13 },
        ],
      },
    ]
  },
  {
    _id: "00390395",
    groups: [
      {
        _id: "837583",
        name: "Group 1",
        group_type: "group_1",
        items: [
          { name: "Name 1", value: 699 },
          { name: "Name 2", value: 55},
          { name: "Name 3", value: 39 },
        ],
      },
      {
        _id: "8989305",
        name: "Group 2",
        group_type: "group_2",
        items: [
          { name: "Name 4", value: 998 },
          { name: "Name 5", value: 12 },
          { name: "Name 6", value: 485 },
        ],
      },
    ]
  }
];

checkLargest(d);
placePercentages(d);
console.log(d);
...