【问题标题】:Merge multiple array of objects and average duplicate values javascript合并多个对象数组并平均重复值javascript
【发布时间】:2017-05-18 06:13:06
【问题描述】:

我遇到了这个话题:Merge multiple array of objects and sum duplicate values javascript,它与我想做的事情非常接近。

我本质上需要同样的东西,但我需要平均值而不是总和。我认为可以解决问题的是:

var array1 = [{
    price: "2",
    ref: "A"
  },
  {
    price: "20",
    ref: "B"
  },
  {
    price: "23",
    ref: "C"
  },
  {
    price: "23",
    ref: "D"
  }
];

var array2 = [{
    price: "12",
    ref: "A"
  },
  {
    price: "5",
    ref: "B"
  },
  {
    price: "23",
    ref: "E"
  },
  {
    price: "23",
    ref: "F"
  }
];

var array3 = [{
    name: "Blah",
    fcp: "erol"
  },
  {
    name: "Blah2",
    fcp: "tpep"
  }
];

var averagedArr = 2

var result = array1.concat(array2, array3).reduce(function(acc, curr) {
  if (curr.ref) {
    var fromMap = acc.map[curr.ref];
    if (!fromMap) {
      acc.map[curr.ref] = fromMap = {
        price: 0,
        ref: curr.ref
      }
      acc.result.push(fromMap);
    }
    fromMap.price += parseFloat(curr.price);
    fromMap.price = parseFloat(fromMap.price/averagedArr);
  } else {
    acc.result.push(curr);
  }
  return acc;
}, {
  map: {},
  result: []
}).result;

console.log(result);

它不起作用,因为它似乎是在添加每个价格时平均每个价格,而不是在它们全部加在一起之后。例如,对于ref:B,结果为12.5(20+5 除以2),结果为7.5(20/2=10;10+5=15;15/2 = 7.5)。如果有人能帮我解决这个问题,我将不胜感激。

我会向提供我正在使用的回复的@Grundy 评论原始主题,但这是我的第一个问题,我无法发表评论。

这是小提琴。 https://jsfiddle.net/5xqbk9Lg/

提前致谢!

【问题讨论】:

  • 基本上,您需要一个属性来表示值的总和,而平均值则需要保留总和并在另一个属性中建立平均值。以及您需要为每个推荐人设置一个计数器。

标签: javascript arrays object average


【解决方案1】:

如果创建了新的哈希条目,您可以收集哈希表中的所有值并为结果创建数据集。稍后收集价格并计算并建立实际ref的平均值。

var array1 = [{ price: "2", ref: "A" }, { price: "20", ref: "B" }, { price: "23", ref: "C" }, { price: "23", ref: "D" }],
    array2 = [{ price: "12", ref: "A" }, { price: "5", ref: "B" }, { price: "23", ref: "E" }, { price: "23", ref: "F" }],
    array3 = [{ name: "Blah", fcp: "erol" }, { name: "Blah2", fcp: "tpep" }],
    hash = Object.create(null),
    result = [];

[array1, array2, array3].forEach(function (a) {
    a.forEach(function (b) {
        if ('ref' in b) {
            if (!hash[b.ref]) {
                hash[b.ref] = { result: { ref: b.ref, avg: 0 }, sum: 0, count: 0 };
                result.push(hash[b.ref].result);
            }
            hash[b.ref].sum += +b.price,
            hash[b.ref].count++;
            hash[b.ref].result.avg = hash[b.ref].sum / hash[b.ref].count;
        }
    });
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 这看起来很酷。我以前没有使用过哈希表。肯定会玩这个,谢谢。
【解决方案2】:

改变一下

fromMap.price = parseFloat(fromMap.price/averagedArr);

fromMap.finalPrice = parseFloat(fromMap.price/averagedArr);

并使用 finalPrice 变量作为结果。问题是您要为添加到价格中的每个项目除以 averagedArr,而不仅仅是在最后,您所描述的正是错误。通过使用单独的变量来存储您的最终结果,您不会每次都求和。

【讨论】:

  • 现在想出这个显然已经太晚了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-08-30
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多