How to get objects with the same property and has maximum value in the array - Javascript

How to get objects with the same property and has the maximum value in the array I have data such as

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

And I want to get the result

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

Are there any better ways than what I did here?

 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); } 
+5
source share
4 answers

You should look for array methods such as map, filter and in this case reduce:

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

(this, of course, is a map of the object, depending on your use case, you need to get values ​​by calling Object.values(result) or iterate over the object itself

+1
source

You can use array#reduce and use the object to find the highest version number for a given header.

 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); 
+1
source

You can use the Math.max method in combination with the filter and map methods.

 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); 
0
source

You can use a map from your array of unique names to get the expected result:

 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); 
0
source

Source: https://habr.com/ru/post/1274212/


All Articles