2017-02-24 129 views
5

我需要過濾一個數組,我完全在如何做到這一點上留下了空白。過濾字符串數組

我需要篩選出最大的數字。當第一個數字是'XXXX',第二個數字是'XXXX-1'時,可以認爲數字更大,然後第二個數字更大。或者,如果第一個數字爲'XXXX-1',第二個數字爲'XXXX-2',則第二個數字最大。

如果數字沒有更大的版本,在下面的示例中讓我們看看'2234'。沒有'2234-1',因此,'2234'是同類中最大的,應該刪除。

所以給這個陣列(串)爲例:

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

我希望這樣的結果:

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

回答

5

您能集團的項目,對其進行排序後,再彈出最後並查找保存的值來過濾原始數組。

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

的組合減少和地圖會做的工作一氣呵成:

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

使用JavaScript你可以試試下面的代碼:

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

這是最快的方法! – baao

+0

它改變了順序。 –

0

目前所有的解決方案假定數字將XXXX-Y其中Y總是09之間的數字(也許這是要求,但目前尚不清楚的問題)。在這種情況下,我們正在與Strings合作,所以1234-15將低於1234-7。需要以數字方式對Arrays進行排序。如果我們使用下一個Array與當前解決方案的頁面上,這將是結果:

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"] 

數量14670-7已經因爲下跌,爲String,其大於14670-1014670-20

在這裏,你有第一批訂單的Array的解決方案,以及未來降低值,以獲得較低的人(此解決方案改變了原有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));

這另一種解決方案是稍長一點,但它保持原來的順序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));