2017-12-20 21 views
5

Jak uzyskać obiektów z tej samej nieruchomości i ma wartość max w tablicy Mam danych jakjak uzyskać obiektów z tej samej nieruchomości i ma wartość max w tablicy - Javascript

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

And I chcesz uzyskać wynik

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

Czy istnieją lepsze sposoby niż to, co tutaj zrobiłem?

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); 
    } 

Odpowiedz

1

Należy patrzeć metod tablicowych jak mapa, filtr iw tym przypadku zmniejsz:

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

(to jest oczywiście mapa obiektu, w zależności od użytkową przypadku trzeba uzyskać wartości z wezwaniem do Object.values(result) lub mogłyby iteracyjne nad samego obiektu

0

Można użyć Math.max metody w połączeniu z filter i map metody.

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

Można użyć mapy z tablicy unikalnych tytułów, aby uzyskać wynik można oczekiwać:

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

1

Można użyć array#reduce i używać szukaj obiektu, aby uzyskać najwyższy numer wersji dla danego tytułu.

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

Powiązane problemy