合并多个对象数组和平均重复值javascript

时间:2017-05-18 06:13:07

标签: javascript arrays object average

我遇到了这个话题: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(20 + 5除以2)而不是12.5,结果为7.5(20/2 = 10; 10 + 5 = 15; 15/2 = 7.5)。如果有人能帮我解决这个问题,我将非常感激。

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

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

提前致谢!

2 个答案:

答案 0 :(得分: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; }

答案 1 :(得分:0)

只需更改

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

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

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