добавление значений и объединение json объектов на основе ключа в d3js - PullRequest
0 голосов
/ 30 мая 2020

У меня есть переменная, которая выглядит примерно так, когда я делаю console.log (variable1).


    0: {node01: "site05", amount: 1010}
    1: {node01: "site02", amount: 1200}
    2: {node01: "site08", amount: 880}
    3: {node01: "site04", amount: 870}
    4: {node01: "site01", amount: 650}
    5: {node01: "site06", amount: 1370}
    6: {node01: "site07", amount: 100}
    7: {node01: "site09", amount: 210}
    8: {node01: "site10", amount: 340}

Другая переменная, которая выглядит так в console.log (variable2):


    0: {node02: "site08", amount: 100}
    1: {node02: "site02", amount: 200}
    2: {node02: "site03", amount: 1050}
    3: {node02: "site07", amount: 1300}
    4: {node02: "site09", amount: 850}
    5: {node02: "site10", amount: 890}
    6: {node02: "site04", amount: 640}
    7: {node02: "site06", amount: 290}
    8: {node02: "site01", amount: 50}
    9: {node02: "site05", amount: 200}
    10: {node02: "site11", amount: 1060}

Я хочу добавить количество обеих переменных, например, на основе значения узла, «node01»: «site05» имеет количество: 1010 и «node02»: «site05» имеет количество: 200, результирующая переменная должна иметь «node»: «site05» количество: 1210. Также "site11" не существует в переменной1. поэтому у него должно быть просто значение «node»: «site11» amount: 1060 -> это происходит только из переменной2

Я пробовал использовать два вложенных цикла for, но это приводит только к узлам, доступным в одной переменной. Я не знаю, как их все сопоставить. Кроме того, есть ли решение, использующее только d3 js без использования циклов for, родных для js? насколько я понимаю, у D3 есть другой подход к зацикливанию

Заранее спасибо

1 Ответ

1 голос
/ 30 мая 2020

Я думаю, вы, вероятно, захотите подготовить свои данные, а затем отправить консолидированный результат в D3. Например:

 const list1 = [
   {node01: "site05", amount: 1010},
   {node01: "site02", amount: 1200},
   {node01: "site08", amount: 880},
   {node01: "site04", amount: 870},
   {node01: "site01", amount: 650},
   {node01: "site06", amount: 1370},
   {node01: "site07", amount: 100},
   {node01: "site09", amount: 210},
   {node01: "site10", amount: 340},
];
const list2 = [
    {node02: "site08", amount: 100},
    {node02: "site02", amount: 200},
    {node02: "site03", amount: 1050},
    {node02: "site07", amount: 1300},
    {node02: "site09", amount: 850},
    {node02: "site10", amount: 890},
    {node02: "site04", amount: 640},
    {node02: "site06", amount: 290},
    {node02: "site01", amount: 50},
    {node02: "site05", amount: 200},
    {node02: "site11", amount: 1060},
];

const combinedList = [
  ...list1,
  ...list2,
];

const output = Object.values(combinedList.reduce((a, c) => {
  const node = Object.values(c).find(v => typeof v === 'string');
  a[node] = a[node] || {node, amount: 0};
  a[node].amount += c.amount;
  return a;
}, {}));

console.log(output);
...