2017-12-20 95 views
5

Làm thế nào để có được đối tượng với thuộc tính giống nhau và có giá trị tối đa trong mảng Tôi có một dữ liệu nhưlàm thế nào để có được đối tượng với thuộc tính giống nhau và có giá trị tối đa trong mảng - Javascript

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

Và tôi muốn kết quả

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

Có cách nào tốt hơn những gì tôi đã làm ở đây không?

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

Trả lời

1

Bạn nên tìm kiếm các phương pháp mảng như bản đồ, bộ lọc và trong trường hợp này giảm:

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

(điều này là tất nhiên một bản đồ đối tượng, tùy thuộc vào việc sử dụng hợp cụ thể của bạn, bạn cần phải nhận được các giá trị với một cuộc gọi đến Object.values(result) hoặc có thể lặp qua các đối tượng chính nó

0

Bạn có thể sử dụng phương pháp Math.max kết hợp với filtermap phương pháp.

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

Bạn có thể sử dụng bản đồ từ mảng lại danh hiệu độc đáo để có được những kết quả mà bạn mong đợi:

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

Bạn có thể sử dụng array#reduce và sử dụng một đối tượng tìm kiếm để nhận số phiên bản cao nhất cho một tiêu đề nhất định.

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

Các vấn đề liên quan