添加值并合并 json 基于 d3js 中的键的对象
adding values and merging json objects based on key in d3js
当我执行 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" 有 amount:1010 和 "node02":"site05" 有 amount:200
结果变量应该有 "node":"site05" amount:1210。此外,"site11" 在 variable1 中不存在。所以它应该只有值 "node":"site11" amount:1060 --> 这仅来自 variable2
我尝试使用两个嵌套的 for 循环,但它只会导致节点在一个变量中可用。
我不确定如何映射它们。
另外,是否有仅使用 d3js 而不使用 js 原生的 for 循环的解决方案?据我了解,D3 还有其他一些循环方法
提前致谢
我认为您可能想要准备数据,然后将合并结果发送到 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);
当我执行 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" 有 amount:1010 和 "node02":"site05" 有 amount:200 结果变量应该有 "node":"site05" amount:1210。此外,"site11" 在 variable1 中不存在。所以它应该只有值 "node":"site11" amount:1060 --> 这仅来自 variable2
我尝试使用两个嵌套的 for 循环,但它只会导致节点在一个变量中可用。 我不确定如何映射它们。 另外,是否有仅使用 d3js 而不使用 js 原生的 for 循环的解决方案?据我了解,D3 还有其他一些循环方法
提前致谢
我认为您可能想要准备数据,然后将合并结果发送到 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);