如何在Javascript中正确映射对象数组

如何在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" }; 我希望以

我很难将数据映射到d3堆叠条可视化所需的正确输出格式,因为我正在处理的对象很复杂

我的对象当前看起来像这样


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)