【问题标题】:javascript object array sum values based on two criteria基于两个标准的javascript对象数组总和值
【发布时间】:2018-10-12 11:04:54
【问题描述】:

您好,我刚刚开始使用 javascript。我一直在尝试通过 ZOPR_TNLO 对我的对象数组求和并将其添加到一个新数组中。

所以我得到了一个带有 ZOPR_TNLO:、Actions、Values 的新数组。请帮忙:)

 var acountsJson = [{A0CALMONTH_T: "JAN 2015", ZOPR_TNLO:       "OP.BUBBLES", Actions: "Arrests", Values: "1"},
{A0CALMONTH_T: "JAN 2015", ZOPR_TNLO: "OP.BUBBLES", Actions:  "DrinkDriving", Values: "2"},
{A0CALMONTH_T: "JAN 2015", ZOPR_TNLO: "OP.BUBBLES", Actions:  "DrinkDriving", Values: "2"},
{A0CALMONTH_T: "DEC 2017", ZOPR_TNLO: "DECEMBER 2017", Actions: "Arrests", Values: "3"},
{A0CALMONTH_T: "DEC 2017", ZOPR_TNLO: "DECEMBER 2017", Actions: "DrinkDriving", Values: "0"},
{A0CALMONTH_T: "DEC 2017", ZOPR_TNLO: "DECEMBER 2017", Actions: "Arrests", Values: "5"},
{A0CALMONTH_T: "DEC 2017", ZOPR_TNLO: "DECEMBER 2017", Actions: "DrinkDriving", Values: "0"}
];

var task = ["DECEMBER 2017", "OP.BUBBLES"];

var kpi = ["Arrests", "DrinkDriving"]


var resultsArray = [];
var resultsArray1 = [];

var summedValues1 = 0;

for (var p = 0; p < task.length; p++) { //takes the first task from list of task
for (var e = 0; e < kpi.length; e++) { //takes the kpi from the list

for (var i = 0; i < acountsJson.length; i++) {

if(acountsJson[i].ZOPR_TNLO === task[p] && acountsJson[i].Actions   === kpi[e]){

//console.log(e);
summedValues1 += Number(acountsJson[i].Values);
var task1 = acountsJson[i].ZOPR_TNLO;
var Actions1 = acountsJson[i].Actions;
}

 }//thrid loop which loops through the json data 
 var index = acountsJson.findIndex(x => x.ZOPR_TNLO==task1 && 
 x.Actions==Actions1)
// here you can check specific property for an object whether it exist in 
your array or not
/// Trying to add this to check before push
if (index === -1){
resultsArray1.push({
ZOPR_TNLO: task1,
Actions: Actions1,
SUMMED_VALUES: summedValues1
 })


console.log("no");
 }
 else 

console.log("object already exists");
summedValues1 = 0;
 } //second for loop

}//first loop

https://playcode.io/132805?tabs=console&script.js&output

为我的 indexof 语句获取错误“未捕获的语法错误意外令牌”。

我可能完全错了。我要做的就是通过两个键 ZOPR_TNLO 操作(值中的总和值)对我的 acountsJson 求和。

通过键创建一个具有唯一值的新对象数组,例如

    ZOPR_TNLO       Actions     Values(summed)
  OP.BUBBLES        DrinkDriving        4
  OP.BUBBLES        Arrests            1
  December 2017     Arrests            8
  December 2017     DrinkDriving        0

【问题讨论】:

  • 您能分享您要查找的确切结果对象吗?
  • 请添加错误,你得到了。实际上它会返回一些东西,但不会引发错误。如果您想获得另一个数据结构作为结果,请将其添加到问题中并添加问题。
  • 那个findIndex 语句应该是var index = acountsJson.findIndex(x =&gt; x.ZOPR_TNLO == task1 &amp;&amp; x.Actions == Actions1)
  • 哇感谢滑块太棒了,它修复了错误,现在它按预期工作。仅供参考,我想在这里实现什么,除了循环之外,还有更好的方法来编写代码吗?
  • 抱歉,我如何将帖子标记为已完成或已回答?

标签: javascript arrays object criteria


【解决方案1】:

您可以使用Map 和稍后的Array.from 来收集所需的数据并生成所需的结果集。

var data = [{ A0CALMONTH_T: "JAN 2015", ZOPR_TNLO: "OP.BUBBLES", Actions: "Arrests", Values: "1" }, { A0CALMONTH_T: "JAN 2015", ZOPR_TNLO: "OP.BUBBLES", Actions: "DrinkDriving", Values: "2" }, { A0CALMONTH_T: "JAN 2015", ZOPR_TNLO: "OP.BUBBLES", Actions: "DrinkDriving", Values: "2" }, { A0CALMONTH_T: "DEC 2017", ZOPR_TNLO: "DECEMBER 2017", Actions: "Arrests", Values: "3" }, { A0CALMONTH_T: "DEC 2017", ZOPR_TNLO: "DECEMBER 2017", Actions: "DrinkDriving", Values: "0" }, { A0CALMONTH_T: "DEC 2017", ZOPR_TNLO: "DECEMBER 2017", Actions: "Arrests", Values: "5" }, { A0CALMONTH_T: "DEC 2017", ZOPR_TNLO: "DECEMBER 2017", Actions: "DrinkDriving", Values: "0" }],
    task = ["DECEMBER 2017", "OP.BUBBLES"], // ZOPR_TNLO
    kpi = ["Arrests", "DrinkDriving"],      // Actions
    result = Array.from(
        data.reduce((m, { ZOPR_TNLO, Actions, Values }) =>
            (key => task.includes(ZOPR_TNLO) && kpi.includes(Actions)
                ? m.set(key, (m.get(key) || 0) + +Values)
                : m)([ZOPR_TNLO, Actions].join('|')),
            new Map()
        ),
        ([k, Values]) => (([ZOPR_TNLO, Actions]) => ({ ZOPR_TNLO, Actions, Values }))(k.split('|'))
    );

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

【讨论】:

  • 感谢您的替代方案,我尝试使用 map 和 reduce,但无法理解它们以弄明白。
猜你喜欢
  • 2022-06-10
  • 2020-09-19
  • 2015-06-08
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 2015-06-10
相关资源
最近更新 更多