2017-02-24 43 views
5

Bir diziyi filtrelemem gerekiyor ve nasıl yapılacağı konusunda bir boşluk çiziyorum.Bir dizi dizgeyi filtrelemek

En büyük sayıları filtrelemem gerekiyor. İlk sayı 'XXXX' ve ikincisi 'XXXX-1' olduğu zaman bir sayı daha büyük sayılabilir, sonra ikinci sayı daha büyüktür. Ya da ilk sayı 'XXXX-1' ise ve ikincisi 'XXXX-2' ise, ikincisi en büyüğü ise daha büyük sayılabilir.

Sayının daha büyük bir sürümü yoksa, aşağıdaki örnekte '2234''a bakalım. '2234-1' yoktur, bu nedenle '2234' türünün en büyüğüdür ve kaldırılmalıdır. Ben bu sonucu beklenebilir

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

:

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

cevap

5

Yapabilirsin grup öğeleri ve daha sonra, ardından son pop sıralamak

Yani örnek olarak (dizeleri) bu diziyi verilen ve orijinal diziyi, kayıtlı değere bir göz atmak suretiyle filtreleyin.

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

birleşimi azaltmak ve harita tek seferde iş yapacağını:

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

aşağıdaki kodu deneyebilirsiniz JavaScript kullanma:

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

Bu en hızlı yaklaşım! – baao

+0

siparişi değiştirir. –

0

tüm güncel çözümler Y0 ve 9 arasında bir sayı daima olduğu sayılar XXXX-Y olacağını varsayabiliriz (belki gerekliliktir, ancak söz konusu açık değildir). Bu durumda, Strings ile çalışıyoruz, bu nedenle 1234-15, 1234-7'dan daha düşük olacaktır. Arrays'u sayısal bir şekilde sıralamak gerekir.

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

sayı 14670-7, çünkü düşmüş String olarak, daha büyük daha 14670-10 ve 14670-20 geçerli: sayfadaki güncel çözümlerle Array sonraki kullanırsanız, bu sonuçlar olacaktır.İşte

ilk Array sıralayan bir çözüm var ve bir sonraki (bu çözüm orijinal Array sırasını değiştirir) alt olanları almak için

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

Bu değerleri azaltmak Başka bir çözüm biraz daha uzun ancak orijinal 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));