首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何找到包含在单独数组中的两个值的百分比?

如何找到包含在单独数组中的两个值的百分比?
EN

Stack Overflow用户
提问于 2019-07-03 16:44:36
回答 2查看 57关注 0票数 1

我需要一点帮助来解决一个问题,我想看看是否有人能帮我:

我有一个对象,格式如下:

代码语言:javascript
复制
{
   red: [
      {time: "00:00:05", value: "7"},
      {time: "00:00:10", value: "3"}],
   green: [
     {time: "00:00:05", value: "3"},
      {time: "00:00:10", value: "27"}]
}

我需要做的是:

  • 在考虑“时间”和“值”的情况下,获取“绿色”和“红色”内每个对象的百分比份额。
  • 在每个“绿色”和“红色”对象上添加共享值。

它的外观示例:

代码语言:javascript
复制
{
   red: [
      {time: "00:00:05", value: "7", share: "70%"},
      {time: "00:00:10", value: "3", share: "10%"}],
   green: [
     {time: "00:00:05", value: "3", share: "30%"},
      {time: "00:00:10", value: "27", share: "90%"}]
}

有人能帮我吗?我不能这么做。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-03 17:54:06

简短而简单的解决方案:

代码语言:javascript
复制
const o = {
  red: [
    {time: "00:00:05",value: "7"},
    {time: "00:00:10",value: "3"}
  ],
  green: [
    {time: "00:00:05",value: "3"},
    {time: "00:00:10",value: "27"}
  ]
};
const colors = Object.keys(o);

// saves the sum of all values, for each time
const total = o[colors[0]]
  .map(x => x.time)
  .map(time => colors
    .map(c => +o[c].find(x => x.time == time).value)
    .reduce((a, b) => a + b, 0)
  );
  
// adds the 'share' property
colors.forEach(c => o[c].forEach((x, i) => o[c][i].share = `${Math.floor(100*x.value/total[i])}%`))
console.log(o);

票数 0
EN

Stack Overflow用户

发布于 2019-07-03 17:32:42

我想出了这个愚蠢的技术,但你还可以尝试更多。

我将将所有数据分组到一个数组中,但保留objectKey (红色、绿色或其他任何数据)和indexKey作为Symbol(),这样就不会出现任何名称干扰。

代码语言:javascript
复制
let data = {
    red: [
        {time: "00:00:05", value: "7", share: "70%"},
        {time: "00:00:10", value: "3", share: "10%"}
    ],
    green: [
        {time: "00:00:05", value: "3", share: "30%"},
        {time: "00:00:10", value: "27", share: "90%"}
    ]
}

let temp = [], objectKey = Symbol("object"), indexKey = Symbol("index")
for(let object in data) {
    temp = [ ...temp, ...data[object].map((x, index) => ({ ...x, [objectKey]: object, [indexKey]: index }))]
}

temp将如下所示:

代码语言:javascript
复制
[
    {time: "00:00:05", value: "7", [objectKey]: "red", [indexKey]: 0},
    {time: "00:00:10", value: "3", [objectKey]: "red", [indexKey]: 1}
    {time: "00:00:05", value: "3", [objectKey]: "green", [indexKey]: 0},
    {time: "00:00:10", value: "27", [objectKey]: "green", [indexKey]: 1}
]

现在,我将按时间分组所有数据:

代码语言:javascript
复制
let temp2 = temp.reduce((r, a) => (r[a.time] = r[a.time] || [], r[a.time].push(a), r), {});

所以我们得到了这样的temp2

代码语言:javascript
复制
{
    "00:00:05": [
        {time: "00:00:05", value: "7", [objectKey]: "red", [indexKey]: 0},
        {time: "00:00:05", value: "3", [objectKey]: "green", [indexKey]: 0},
    ],
    "00:00:10": [
        {time: "00:00:10", value: "3", [objectKey]: "red", [indexKey]: 1}
        {time: "00:00:10", value: "27", [objectKey]: "green", [indexKey]: 1}
    ]
}

现在我可以得到每个组的和,得到所需的百分比,并将其保存到正确的位置:

代码语言:javascript
复制
for(let time in temp2) {
    let sum = temp2[time].reduce((r, a) => (r + parseInt(a.value)), 0)
    temp2[time].forEach(e => (data[e[objectKey]][e[indexKey]].share = (e.value / sum * 100) + "%"))
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56874733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档