首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据标签和和数据将地图内的数组组合起来

根据标签和和数据将地图内的数组组合起来
EN

Stack Overflow用户
提问于 2022-08-22 01:13:02
回答 3查看 73关注 0票数 1

根据班次(上午和下午),我有一个包含一些流通道数据的数组。

我花了一晚上的时间尝试一些功能,比如reduce,但我无法理解它是如何工作的,并且停滞不前。

代码语言:javascript
复制
var array = [{"label":"manha","data":[{"Amazon Prime":"0.00"},{"AppleTV":"0.00"},{"HBO Max":"25.00"},{"Nenhuma":"0.00"},{"Netflix":"55.00"},{"Outro":"20.00"}]},{"label":"manha","data":[{"Amazon Prime":"50.00"},{"AppleTV":"0.00"},{"HBO Max":"25.00"},{"Nenhuma":"0.00"},{"Netflix":"25.00"},{"Outro":"0.00"}]},{"label":"manha","data":[{"Amazon Prime":"0.00"},{"AppleTV":"0.00"},{"HBO Max":"0.00"},{"Nenhuma":"50.00"},{"Netflix":"50.00"},{"Outro":"0.00"}]},{"label":"tarde","data":[{"Amazon Prime":"10.00"},{"AppleTV":"11.00"},{"HBO Max":"0.00"},{"Nenhuma":"50.00"},{"Netflix":"9.00"},{"Outro":"20.00"}]},{"label":"tarde","data":[{"Amazon Prime":"0.00"},{"AppleTV":"0.00"},{"HBO Max":"5.00"},{"Nenhuma":"25.00"},{"Netflix":"20.00"},{"Outro":"50.00"}]}]

我希望有这样的输出:

所有流信道的总和,除以每班(上午和下午)的对象值的数量。

代码语言:javascript
复制
[{"label":"manha","data":[{"Amazon Prime":"16.66"},{"AppleTV":"0.00"},{"HBO Max":"16.66"},{"Nenhuma":"16.66"},{"Netflix":"43.33"},{"Outro":"6.66"}]},{"label":"tarde","data":[{"Amazon Prime":"5.00"},{"AppleTV":"5.50"},{"HBO Max":"2.50"},{"Nenhuma":"36.00"},{"Netflix":"14.50"},{"Outro":"35.00"}]}]

如果你能帮助我,如果可能的话,解释一下,我将非常感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-08-22 03:08:23

让我们分步骤解决这个问题。第一次尝试是使用reduce迭代结果并构建某些内容。为了简单起见,让我们让它构建一个keys表示标签的对象。原因是我们可以使用这个key将类似的键合并在一起。在TODO上,我们观察到:

  • 数值是字符串而不是数字,不适合算术运算
  • 子数组很难合并,也可以通过转换为

来完成。

代码语言:javascript
复制
let array = [{"label":"manha","data":[{"Amazon Prime":"0.00"},{"AppleTV":"0.00"},{"HBO Max":"25.00"},{"Nenhuma":"0.00"},{"Netflix":"55.00"},{"Outro":"20.00"}]},{"label":"manha","data":[{"Amazon Prime":"50.00"},{"AppleTV":"0.00"},{"HBO Max":"25.00"},{"Nenhuma":"0.00"},{"Netflix":"25.00"},{"Outro":"0.00"}]},{"label":"manha","data":[{"Amazon Prime":"0.00"},{"AppleTV":"0.00"},{"HBO Max":"0.00"},{"Nenhuma":"50.00"},{"Netflix":"50.00"},{"Outro":"0.00"}]},{"label":"tarde","data":[{"Amazon Prime":"10.00"},{"AppleTV":"11.00"},{"HBO Max":"0.00"},{"Nenhuma":"50.00"},{"Netflix":"9.00"},{"Outro":"20.00"}]},{"label":"tarde","data":[{"Amazon Prime":"0.00"},{"AppleTV":"0.00"},{"HBO Max":"5.00"},{"Nenhuma":"25.00"},{"Netflix":"20.00"},{"Outro":"50.00"}]}];
let result = array.reduce( function (p, c, i, a) {
   let label = c.label;
   if (!(label in p)) {
       p[label] = c.data;
   }
   return p;
}, { } );
console.log(JSON.stringify(result, undefined, 2));

// Output:
// {
//   "manha": [ { "Amazon Prime": "0.00" },
//              { "AppleTV": "0.00" },
//              { "HBO Max": "25.00" },
//              { "Nenhuma": "0.00" },
//              { "Netflix": "55.00" },
//              { "Outro": "20.00" }
//            ],
//   "tarde": [ { "Amazon Prime": "10.00" },
//              { "AppleTV": "11.00" },
//              { "HBO Max": "0.00" },
//              { "Nenhuma": "50.00" },
//              { "Netflix": "9.00" },
//              { "Outro": "20.00" }
//            ]
// }

对于第二次尝试,我们将:

not

  • 将更多的数组转换为对象
    • 作为对象,我们可以使用对象方法(如in )来确定密钥是否存在或

  • 我们可以使用parseFloat将字符串转换为数字
  • ,我们可以开始将信息整理在一起,从而生成一组很好的原始数据。

代码语言:javascript
复制
let array = [{"label":"manha","data":[{"Amazon Prime":"0.00"},{"AppleTV":"0.00"},{"HBO Max":"25.00"},{"Nenhuma":"0.00"},{"Netflix":"55.00"},{"Outro":"20.00"}]},{"label":"manha","data":[{"Amazon Prime":"50.00"},{"AppleTV":"0.00"},{"HBO Max":"25.00"},{"Nenhuma":"0.00"},{"Netflix":"25.00"},{"Outro":"0.00"}]},{"label":"manha","data":[{"Amazon Prime":"0.00"},{"AppleTV":"0.00"},{"HBO Max":"0.00"},{"Nenhuma":"50.00"},{"Netflix":"50.00"},{"Outro":"0.00"}]},{"label":"tarde","data":[{"Amazon Prime":"10.00"},{"AppleTV":"11.00"},{"HBO Max":"0.00"},{"Nenhuma":"50.00"},{"Netflix":"9.00"},{"Outro":"20.00"}]},{"label":"tarde","data":[{"Amazon Prime":"0.00"},{"AppleTV":"0.00"},{"HBO Max":"5.00"},{"Nenhuma":"25.00"},{"Netflix":"20.00"},{"Outro":"50.00"}]}];
let result = array.reduce( function (p, c, i, a) {
   let label = c.label;
   if (!(label in p)) {
       p[label] = { };
   }
   for (let i = 0; i < c.data.length; i++) {
       let e = Object.entries(c.data[i]);
       let k = e[0][0];
       let v = parseFloat(e[0][1]);
       if (!(k in p[label])) {
           p[label][k] = [ ];
       }
       p[label][k].push(v);
   }
   return p;
}, { } );
console.log(JSON.stringify(result, undefined, 2));

// Output:
// {
//   "manha": {
//     "Amazon Prime": [ 0, 50, 0 ],
//     "AppleTV":      [ 0, 0, 0 ],
//     "HBO Max":      [ 25, 25, 0 ],
//     "Nenhuma":      [ 0, 0, 50 ],
//     "Netflix":      [ 55, 25, 50 ],
//     "Outro":        [ 20, 0, 0 ]
//   },
//   "tarde": {
//     "Amazon Prime": [ 10, 0 ],
//     "AppleTV": [ 11, 0 ],
//     "HBO Max": [ 0, 5 ],
//     "Nenhuma": [ 50, 25 ],
//     "Netflix": [ 9, 20 ],
//     "Outro": [ 20, 50 ]
//   }
// }

对于最后一步,我们只是将剩余的数组平均化,并将数值结果转换回字符串。

代码语言:javascript
复制
let array = [{"label":"manha","data":[{"Amazon Prime":"0.00"},{"AppleTV":"0.00"},{"HBO Max":"25.00"},{"Nenhuma":"0.00"},{"Netflix":"55.00"},{"Outro":"20.00"}]},{"label":"manha","data":[{"Amazon Prime":"50.00"},{"AppleTV":"0.00"},{"HBO Max":"25.00"},{"Nenhuma":"0.00"},{"Netflix":"25.00"},{"Outro":"0.00"}]},{"label":"manha","data":[{"Amazon Prime":"0.00"},{"AppleTV":"0.00"},{"HBO Max":"0.00"},{"Nenhuma":"50.00"},{"Netflix":"50.00"},{"Outro":"0.00"}]},{"label":"tarde","data":[{"Amazon Prime":"10.00"},{"AppleTV":"11.00"},{"HBO Max":"0.00"},{"Nenhuma":"50.00"},{"Netflix":"9.00"},{"Outro":"20.00"}]},{"label":"tarde","data":[{"Amazon Prime":"0.00"},{"AppleTV":"0.00"},{"HBO Max":"5.00"},{"Nenhuma":"25.00"},{"Netflix":"20.00"},{"Outro":"50.00"}]}];

let tmp = array.reduce( function (p, c, i, a) {
   let label = c.label;
   if (!(label in p)) {
       p[label] = { };
   }
   for (let i = 0; i < c.data.length; i++) {
       let e = Object.entries(c.data[i]);
       let k = e[0][0];
       let v = parseFloat(e[0][1]);
       if (!(k in p[label])) {
           p[label][k] = [ ];
       }
       p[label][k].push(v);
   }
   return p;
}, { } );

let result = Object.entries(tmp).map( ( [label, _data] ) => (
  { label : label,
    data: Object.entries(_data).map( function ( [k, v] ) {
       let obj = { };
       obj[k] = ( v.reduce( (p,c) => p + c ) / v.length ).toFixed(2);
       return obj;
    } )
  }
) );

console.log(JSON.stringify(result, undefined, 2));

// Output:
// [
//   {
//     "label": "manha",
//     "data": [
//       { "Amazon Prime": "16.67" },
//       { "AppleTV": "0.00" },
//       { "HBO Max": "16.67" },
//       { "Nenhuma": "16.67" },
//       { "Netflix": "43.33" },
//       { "Outro": "6.67" }
//     ]
//   },
//   {
//     "label": "tarde",
//     "data": [
//       { "Amazon Prime": "5.00" },
//       { "AppleTV": "5.50" },
//       { "HBO Max": "2.50" },
//       { "Nenhuma": "37.50" },
//       { "Netflix": "14.50" },
//       { "Outro": "35.00" }
//     ]
//   }
// ]

与所提供的问题相比,对这一答复的一些最后意见。

  • I使用了toFixed(2),它为"manha“toFixed(2)实现了一个汇总
    • 应答显示"16.67",而不是"16.66"

对于"tarde“,我得到了"36.00"

  • All (即(50 + 25) / 2 === 37.50 ),而不是"37.50" --在输出中显示的其他值与问题

中要求的值相匹配。

票数 1
EN

Stack Overflow用户

发布于 2022-08-22 02:14:21

这可能比你所期望的要长一些,但它应该会起作用。

代码语言:javascript
复制
let newAr = []
for(el of array) {
  const currentLabel = el.label
  let indexOfLabel = -1
  for(let i = 0; i < newAr.length; ++i) {
    if(newAr[i].label === currentLabel) indexOfLabel = i
  }
  if(indexOfLabel >= 0) {
    for(let i = 0; i < el.data.length; ++i) {
      const key = Object.keys(el.data[i])
      newAr[indexOfLabel].data[i][key] = parseInt(newAr[indexOfLabel].data[i][key])
      newAr[indexOfLabel].data[i][key] += parseInt(el.data[i][key])
    }
  } else {
    newAr.push(el)
  }
}

const occurrences = array.reduce(function (acc, curr) {
  return acc[curr.label] ? ++acc[curr.label] : acc[curr.label] = 1, acc
}, {});

for(el of newAr) {
  for(data of el.data) {
    data[Object.keys(data)] = (data[Object.keys(data)] / occurrences[el.label]).toFixed(2)
  }
}
票数 1
EN

Stack Overflow用户

发布于 2022-08-22 07:20:13

另一种方法。我只使用了两次散列分组来创建一个中间对象,并在最后创建一个最终对象。

代码语言:javascript
复制
const data = [{"label":"manha","data":[{"Amazon Prime":"0.00"},{"AppleTV":"0.00"},{"HBO Max":"25.00"},{"Nenhuma":"0.00"},{"Netflix":"55.00"},{"Outro":"20.00"}]},{"label":"manha","data":[{"Amazon Prime":"50.00"},{"AppleTV":"0.00"},{"HBO Max":"25.00"},{"Nenhuma":"0.00"},{"Netflix":"25.00"},{"Outro":"0.00"}]},{"label":"manha","data":[{"Amazon Prime":"0.00"},{"AppleTV":"0.00"},{"HBO Max":"0.00"},{"Nenhuma":"50.00"},{"Netflix":"50.00"},{"Outro":"0.00"}]},{"label":"tarde","data":[{"Amazon Prime":"10.00"},{"AppleTV":"11.00"},{"HBO Max":"0.00"},{"Nenhuma":"50.00"},{"Netflix":"9.00"},{"Outro":"20.00"}]},{"label":"tarde","data":[{"Amazon Prime":"0.00"},{"AppleTV":"0.00"},{"HBO Max":"5.00"},{"Nenhuma":"25.00"},{"Netflix":"20.00"},{"Outro":"50.00"}]}]

const groups = data.reduce((acc, { label, data }) => {
  acc[label] ??= {};
  data.forEach((item) => {
    const [[channel, value]] = Object.entries(item);
    acc[label][channel] ??= [];
    acc[label][channel].push(Number(value));
  });
  return acc;
}, {});

// groups
//
// {"manha": {
//    "Amazon Prime": [0, 50, 0"],
//    "AppleTV": [0, 0, 0],
//    "HBO Max": [25, 25, 0],
//    "Nenhuma": [0, 0, 50],
//    "Netflix": [55, 25,50],
//    "Outro": [20, 0, 0]},
// ...}

const getFixedAvg = (data) => {
  const average = data.reduce((avg, e) => avg + e) / data.length;
  return (Math.floor(average * 100) / 100) // fix 16.67 to 16.66
    .toFixed(2); 
};

const makeData = (dataObj) => Object.entries(dataObj)
  .map(([channel, dataValues]) => ({ [channel]: getFixedAvg(dataValues) }));
  
const result = Object.entries(groups)
  .map(([label, dataObj]) => ({ label, data: makeData(dataObj) }));

console.log(result);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0 }

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73439346

复制
相关文章

相似问题

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