JSON按名称分组,然后显示最新记录

时间:2019-06-11 22:02:51

标签: javascript json filtering

我只需要使用JavaScript

  1. 按代码分组。
  2. 获取最新的修改日期。
  3. 将分组代码总数显示为“计数”。

开始JSON结果

[
{"ID":1,"code":"AAA","modifieddate":"2019-06-01","user":"John"},
{"ID":2,"code":"AAA","modifieddate":"2019-06-02","user":"Jane"},
{"ID":3,"code":"AAA","modifieddate":"2019-06-03","user":"Sue"},
{"ID":4,"code":"BBB","modifieddate":"2019-06-10","user":"Rick"},
{"ID":5,"code":"CCC","modifieddate":"2019-06-11","user":"Joe"}
]

所需的JSON结果集

[
{"ID":3,"code":"AAA","modifieddate":"2019-06-03","user":"Sue","Count":"3"},
{"ID":4,"code":"BBB","modifieddate":"2019-06-10","user":"Rick","Count":"1"},
{"ID":5,"code":"CCC","modifieddate":"2019-06-11","user":"Joe","Count":"1"}
]
  1. 尝试使用reduce方法。
  2. 我无权修改服务器端API代码。
  3. 我正在使用Aurelia JS。

2 个答案:

答案 0 :(得分:2)

您可以使用Array.reduce对每个项目的code属性的结果集进行分组,根据需要递增Count,然后从累积对象中获取值。在此过程中,我们执行日期比较,以确定要在结果中包括哪个最新条目。

const data = [ {"ID":1,"code":"AAA","modifieddate":"2019-06-01","user":"John"}, {"ID":2,"code":"AAA","modifieddate":"2019-06-02","user":"Jane"}, {"ID":3,"code":"AAA","modifieddate":"2019-06-03","user":"Sue"}, {"ID":4,"code":"BBB","modifieddate":"2019-06-10","user":"Rick"}, {"ID":5,"code":"CCC","modifieddate":"2019-06-11","user":"Joe"} ];

const result = Object.values(data.reduce((a, e) => {
  if (!a[e.code]) {
    a[e.code] = {...e, Count: 0};
  }
  
  if (Date.parse(e.modifieddate) > Date.parse(a[e.code].modifieddate)) {
    a[e.code] = {...e, Count: a[e.code].Count};
  }
  
  a[e.code].Count++;
  return a;
}, {}));

console.log(result);

顺便说一下,这只是我们正在使用的普通JS数组,而不是JSON。

答案 1 :(得分:1)

这应该可以帮助您:

let array = [
  {"ID":1,"code":"AAA","modifieddate":"2019-06-01","user":"John"},
  {"ID":2,"code":"AAA","modifieddate":"2019-06-02","user":"Jane"},
  {"ID":3,"code":"AAA","modifieddate":"2019-06-03","user":"Sue"},
  {"ID":4,"code":"BBB","modifieddate":"2019-06-10","user":"Rick"},
  {"ID":5,"code":"CCC","modifieddate":"2019-06-11","user":"Joe"}
]
let result = array.reduce(function(total, currentValue, currentIndex, arr) {
  let index = total.findIndex(function(entry) { return entry.code == currentValue.code; })
  if (index >= 0) { // entry already exists
    // check modified
    if (total[index].modifieddate > currentValue.modifieddate) { // already have most recent of the two
      total[index].Count += 1;
    } else { // need to replace with more recent
      currentValue.Count = total[index].Count + 1;
      total[index] = currentValue;
    }
  } else { // first record for this code
    currentValue.Count = 1;
    total.push(currentValue);
  }
  return total;
}, []);
console.log(result);

这是工作中的js-fiddle

注意:在代码块中进行注释