如何在Javascript中正确映射对象数组
我很难将数据映射到d3堆叠条可视化所需的正确输出格式,因为我正在处理的对象很复杂 我的对象当前看起来像这样如何在Javascript中正确映射对象数组,javascript,arrays,d3.js,Javascript,Arrays,D3.js,我很难将数据映射到d3堆叠条可视化所需的正确输出格式,因为我正在处理的对象很复杂 我的对象当前看起来像这样 arr = { reasons: { "No supply": 775, "More than 1 wk": 773, "1 week or less": 1114 }, type: "Napkins" }; 我希望以
arr = {
reasons: {
"No supply": 775,
"More than 1 wk": 773,
"1 week or less": 1114
},
type: "Napkins"
};
我希望以以下形式获得堆栈数组的输出,以便使用堆栈条进行可视化。注意:为了简单起见,所有值都四舍五入为2到2位小数:
stack = {
0: {
reason: "No supply"
startValue: 0
value: 0.29
endValue: 0.29
type: 'Napkins'
},
1: {
reason: "More than 1 wk"
startValue: 0.29
value: 0.28
endValue: 0.58
type: 'Napkins'
},
2: {
reason: "1 week or less"
startValue: 0.58
value: 0.42
endValue: 1.0
type: 'Napkins'
}
}
我目前有这段代码来创建堆栈数组,但是我无法正确地填充它,所以我不断收到错误。我相信这里的映射以及如何访问数组中的不同条目是我的问题
let total = d3.sum(Object.values(arr[1].reasons)); // compute sum across reason values
let value = 0;
let stack = arr.map((d) => ({
reason: Object.keys(d[1].reasons),
value: d.value / total,
startValue: value / total,
endValue: (value += d.value) / total,
type: d.type,
}));
若要获取总和,可以使用Array.reduce。
使用Object.entries,您可以获得Object arr.reason的[key,value]对。
使用Number.toFixed,可以使用定点表示法格式化数字。
常数arr={
原因:{
不供应:775,
超过1周:773,
1周或以下:1114
},
类型:餐巾
};
const total=Object.valuesarr.reasons.reduceacc,cur=>acc+cur,0;
设值=0;
const stack=Object.entriesarr.reasons.map[key,itemVal]=>{
原因:关键,,
值:itemVal/total.toFixed2,
startValue:value/total.toFixed2,
endValue:value+=itemVal/total.toFixed2,
类型:arr.type
};
console.logstack;
若要获取总和,可以使用Array.reduce。
使用Object.entries,您可以获得Object arr.reason的[key,value]对。
使用Number.toFixed,可以使用定点表示法格式化数字。
常数arr={
原因:{
不供应:775,
超过1周:773,
1周或以下:1114
},
类型:餐巾
};
const total=Object.valuesarr.reasons.reduceacc,cur=>acc+cur,0;
设值=0;
const stack=Object.entriesarr.reasons.map[key,itemVal]=>{
原因:关键,,
值:itemVal/total.toFixed2,
startValue:value/total.toFixed2,
endValue:value+=itemVal/total.toFixed2,
类型:arr.type
};
console.logstack 我认为主要的问题是您试图在对象而不是数组上调用.map。要在对象中循环,可以使用for循环
arr = {
reasons: {
"No supply": 775,
"More than 1 wk": 773,
"1 week or less": 1114
},
type: "Napkins"
};
const value = 0
const total = 775+773+1114
let stack = [];
for (let d in arr.reasons) {
let foo = {
reason: d,
value: arr.reasons[d] / total,
startValue: value / total,
endValue: (value += arr.reasons[d]) / total,
type: arr.type,
}
stack.push(foo)
}
console.log(stack)
我认为主要的问题是您试图在对象而不是数组上调用.map。要在对象中循环,可以使用for循环
arr = {
reasons: {
"No supply": 775,
"More than 1 wk": 773,
"1 week or less": 1114
},
type: "Napkins"
};
const value = 0
const total = 775+773+1114
let stack = [];
for (let d in arr.reasons) {
let foo = {
reason: d,
value: arr.reasons[d] / total,
startValue: value / total,
endValue: (value += arr.reasons[d]) / total,
type: arr.type,
}
stack.push(foo)
}
console.log(stack)