2017-02-24 47 views
5

Potrzebuję filtrować tablicę i całkowicie rysuję puste miejsce, jak to zrobić.filtrowanie tablicy łańcuchów znaków

Potrzebuję odfiltrować największe liczby. Liczbę można uznać za większą, gdy pierwsza liczba to 'XXXX', a druga to 'XXXX-1', wtedy druga liczba jest większa. Lub można go uznać za większy, jeśli pierwszy numer to 'XXXX-1', a drugi to 'XXXX-2', a drugi jest największy.

Jeśli numer nie ma większej wersji, w poniższym przykładzie przyjrzyjmy się '2234'. Nie ma żadnego '2234-1', dlatego też '2234' jest największym tego rodzaju i powinno zostać usunięte.

Więc biorąc pod uwagę tę tablicę (ciągów) jako przykład:

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

spodziewałbym ten wynik:

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

Odpowiedz

5

mogłeś Grupa przedmioty i rozwiązać to później, a następnie pop ostatni i filtruj oryginalną tablicę, szukając zapisanej wartości.

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

Połączenie zmniejszyć i mapa będzie wykonać zadanie za jednym zamachem:

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

Korzystanie JavaScript można spróbować poniższy kod:

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

To najszybsze podejście! – baao

+0

zmienia kolejność. –

0

Wszystkie obecne rozwiązania zakładają, że numery będą XXXX-Y gdzie Y jest zawsze liczbą pomiędzy 0 i 9 (być może jest to wymóg, ale nie jest jasne, w pytaniu). W tym przypadku pracujemy z Strings, więc 1234-15 będzie mniejszy niż 1234-7. Jest konieczne sortowanie numeru Arrays w sposób numeryczny. Jeśli używamy następnego Array z obecnych rozwiązań na stronie, będzie to wyniki:

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

Liczba 14670-7 został odrzucony, ponieważ, jak String, to jest większy niż 14670-10 i 14670-20.

Tutaj masz rozwiązanie, które zamawia Array pierwszy, a następnie zmniejszenie wartości, aby uzyskać niższe te (rozwiązanie to zmienia kolejność oryginalnego 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));

ten inne rozwiązanie jest nieco dłuższe, ale zachowuje kolejność oryginalnego kodu: Array: