2017-02-24 20 views
5

Tôi cần phải lọc một mảng và tôi hoàn toàn vẽ một khoảng trống để làm như thế.lọc một chuỗi các chuỗi

Tôi cần lọc ra các số lớn nhất. Một số có thể được coi là lớn hơn khi số đầu tiên là 'XXXX' và số thứ hai là 'XXXX-1', sau đó số thứ hai lớn hơn. Hoặc nó có thể được coi là lớn hơn nếu số đầu tiên là 'XXXX-1' và số thứ hai là 'XXXX-2', sau đó là số thứ hai lớn nhất.

Trong trường hợp số không có phiên bản nào lớn hơn, trong ví dụ bên dưới cho phép xem '2234'. Không có '2234-1', do đó, '2234' là loại lớn nhất của loại hình này và cần được loại bỏ.

Vì vậy, cho mảng này (các chuỗi) là một ví dụ:

['7851', '7851-2', '7851-1', '2234', '2235', '2235-1'] 

Tôi mong chờ kết quả này:

['7851', '7851-1', '2235'] 

Trả lời

5

Bạn có thể nhóm các mục và sắp xếp nó sau này, sau đó bật cuối cùng và lọc mảng ban đầu bằng cách tìm kiếm giá trị đã lưu.

var array = ['7851', '7851-2', '7851-1', '2234', '2235', '2235-1'], 
 
    result = function (array) { 
 
     var groups = Object.create(null); 
 

 
     array.forEach(function (a) { 
 
      var key = a.split('-')[0]; 
 
      groups[key] = groups[key] || []; 
 
      groups[key].push(a); 
 
     }); 
 

 
     Object.keys(groups).forEach(function (k) { 
 
      groups[k].sort().pop(); 
 
     }); 
 

 
     return array.filter(function (a) { 
 
      return groups[a.split('-')[0]].some(function (b) { return a === b; }); 
 
     }); 
 
    }(array); 
 

 
console.log(result);

4

Sự kết hợp giữa giảm và bản đồ sẽ thực hiện công việc trong một đi:

let a = ["7851", "7851-2", "7851-1", "2234", "2235", "2235-1"]; 
 
let b = [...a.reduce((a, b) => { 
 
    let s = b.split("-"); 
 
    a.set(s[0], (!a.has(s[0]) ? [(s[1] || 0)] : a.get(s[0]).concat((s[1] || 0)))); 
 
    return a; 
 
}, new Map()).entries()].map(k => { 
 
    k[1].sort((a, b) => b < a).pop(); 
 
    if (k[1].length === 0) return; 
 
    return k[1].map(f => k[0] + (f > 0 ? "-" + f : "")) 
 
}).filter(v => v).reduce((a, b) => a.concat(b), []); 
 
console.log(b);

4

Sử dụng JavaScript bạn có thể thử vào mã bên dưới:

var numbers = ["7851", "7851-2", "7851-1", "2234", "2235", "2235-1"]; 
 
var arr = []; 
 
for (var i = 0; i < numbers.length; i++) 
 
{ 
 
    // The first part of the number defines the hash key 
 
    var hash_key = numbers[i].split("-")[0]; 
 
    if (arr[hash_key] === undefined) 
 
    { 
 
     arr[hash_key] = []; 
 
    } 
 
    arr[hash_key][arr[hash_key].length] = numbers[i]; 
 
} 
 

 
// sort each array - 
 
// then access all elements but the last and populate numbers array 
 
var numbers = []; 
 
var j = 0; 
 
for (var k in arr) {    
 
    arr[k].sort(); 
 
    for (var i = 0; i < arr[k].length - 1; i++) { 
 
     numbers[j] = arr[k][i]; 
 
     j++;     
 
    } 
 
} 
 

 
console.log(numbers);

+1

Đó là cách tiếp cận nhanh nhất! – baao

+0

nó thay đổi thứ tự. –

0

Tất cả các giải pháp hiện nay cho rằng những con số sẽ XXXX-Y nơi Y luôn luôn là một con số nằm giữa 09 (có thể nó là yêu cầu, nhưng nó không phải là rõ ràng trong câu hỏi). Trong trường hợp này, chúng tôi đang làm việc với Strings, vì vậy 1234-15 sẽ thấp hơn 1234-7. Nó là cần thiết để sắp xếp các Arrays một cách số. Nếu chúng ta sử dụng tiếp theo Array với các giải pháp hiện tại trên trang, đây sẽ là kết quả:

var array = ["14670-20", "7851", "7851-2", "14670-10", "7851-1", "2234", "2235", "2235-1", "14670-7"]; 

// ["14670-20", "7851", "14670-10", "7851-1", "2235"] 
// ["14670-10", "14670-20", "7851", "7851-1", "2235"] 
// ["2235", "7851", "7851-1", "14670-10", "14670-20"] 

Số 14670-7 đã được giảm xuống bởi vì, như String, nó lớn hơn 14670-1014670-20.

Ở đây bạn có một giải pháp sắp xếp cách Array đầu tiên, và tiếp theo giảm các giá trị để có được những người thấp hơn (giải pháp này thay đổi thứ tự của các gốc Array)

var array = ["14670-20", "7851", "7851-2", "14670-10", "7851-1", "2234", "2235", "2235-1", "14670-7"]; 
 

 
function getFilteredArray (array) { 
 
    var reg = /^(\d+)\-?(\d*)$/; \t 
 
    var current = ""; 
 
    var sort = function (a, b) { 
 
     var ra = a.match(reg), rb = b.match(reg); 
 
     if (ra[1] === rb[1]) { return (+ra[2]) - (+rb[2]); } 
 
     return (+ra[1]) - (+rb[1]); 
 
    } 
 
    return array.sort(sort).reduce(function (bundle, item, index) { 
 
     var number = item.split("-")[0]; 
 
     bundle.splice((current !== number) ? -1 : bundle.length, 1, item); 
 
     current = number; 
 
     return bundle; 
 
    }, []).slice(0, -1); 
 
} 
 

 
console.log(getFilteredArray(array));

này một giải pháp khác dài hơn một chút nhưng nó giữ nguyên thứ tự của bản gốc Array:

var array = ["14670-20", "7851", "7851-2", "14670-10", "7851-1", "2234", "2235", "2235-1", "14670-7"]; 
 

 
function getFilteredArray (array) { 
 
    var reg = /^(\d+)\-?(\d*)$/; 
 
    var sort = function (a, b) { 
 
     var ra = a.match(reg), rb = b.match(reg); 
 
     if (ra[1] === rb[1]) { return (+ra[2]) - (+rb[2]); } 
 
     return (+ra[1]) - (+rb[1]); 
 
    } 
 
    var objs = array.reduce(function (bundle, item) { 
 
     var number = item.split("-")[0]; 
 
     bundle[number] = bundle[number] || []; 
 
     bundle[number].push(item); 
 
     return bundle; 
 
    }, {}); 
 
    for (var prop in objs) { 
 
     var last = objs[prop].sort(sort).pop(); 
 
     array.splice(array.indexOf(last), 1); 
 
    } 
 
    return array; 
 
} 
 

 
console.log(getFilteredArray(array));

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