如何获取具有相同属性的对象并在数组中具有最大值 - Javascript

时间:2017-12-20 07:05:37

标签: javascript

如何获取具有相同属性且在数组中具有最大值的对象 我有像

这样的数据
data = [{title: "test1", version: 1},
{title: "test2", version: 3},
{title: "test1", version: 2}, 
{title: "test2", version: 2},
{title: "test2", version: 1}];

我想要结果

result = [{title: "test1", version: 2},
{title: "test2", version: 3}];

有没有比我在这里做的更好的方法?

var titles = [...new Set(data.map(o=> o.title))];
var recentVersions = [];
for(var i = 0; i < titles.length; i++){
      var recentVersion = null;
      for(var j = 0; j < data.length; j++){
        if(titles[i] === data[j].title){
          if(!recentVersion){
            recentVersion = data[j];
          }else if (recentVersion.version < data[j].version){
            recentVersion = data[j];
          }
        }
      }
      recentVersions.push(recentVersion);
    }

4 个答案:

答案 0 :(得分:1)

你应该查找像map,filter这样的数组方法,在这种情况下是reduce:

let result = data.reduce((r, x)=> {
    if(!r[x.title] || r[x.title].version < x.version)
        r[x.title] = x;
    return r;
}, {});

(这当然是一个对象映射,根据您的用例,您需要通过调用Object.values(result)来获取值,或者可以迭代对象本身

答案 1 :(得分:0)

您可以将Math.max方法与filtermap方法结合使用。

let data = [{title: "test1", version: 1}, {title: "test2", version: 3}, {title: "test1", version: 2}, {title: "test2", version: 2}, {title: "test2", version: 1}]; 
let uniqueTitles = [...new Set(data.map(a => a.title))];
data = uniqueTitles.map(function(key){
  return { title:key, version : Math.max(...data.filter(a=>a.title == key).map(a=>a.version)) };
});
console.log(data);

答案 2 :(得分:0)

您可以使用您的独特标题数组中的地图来获得您期望的结果:

&#13;
&#13;
const data = [
    {title: "test1", version: 1},
    {title: "test2", version: 3},
    {title: "test1", version: 2}, 
    {title: "test2", version: 2},
    {title: "test2", version: 1}
];

const titles = [...new Set(data.map(d => d.title))];
const result = titles.map(title => ({
  title,
  version: Math.max(...data.filter(d => d.title === title).map(d => d.version))
}));

console.log(result);
&#13;
&#13;
&#13;

答案 3 :(得分:0)

您可以使用array#reduce并使用查找对象获取给定标题的最高版本号。

&#13;
&#13;
var data = [{title: "test1", version: 1}, {title: "test2", version: 3}, {title: "test1", version: 2}, {title: "test2", version: 2}, {title: "test2", version: 1}],
    result = Object.values(data.reduce((r,o) => {
      r[o.title] = r[o.title] || {version: 0};
      if(r[o.title].version < o.version)
        r[o.title] = o;
      return r;
    },{}));
console.log(result);
&#13;
&#13;
&#13;