String array filtering

I need to filter the array, and I completely draw a space on how to do this.

I need to filter out the largest numbers. A number can be considered large when the first number is 'XXXX' and the second is 'XXXX-1' , then the second number is larger. Or it can be considered large if the first number is 'XXXX-1' and the second is 'XXXX-2' and the second is the largest.

If the number no longer has a larger version, you can see '2234' in the example below. There is no '2234-1' , so in this way '2234' is the largest of its kind and should be removed.

Thus, the given array (of rows) as an example:

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

I would expect this result:

 ['7851', '7851-1', '2235'] 
+5
source share
4 answers

You can group elements and sort them later, and then pop up last and filter the original array with a search for the stored value.

 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); 
+5
source

The combination of abbreviations and cards will complete the task in one go:

 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
source

Using JavaScript , you can try the code below:

 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); 
+4
source

All current solutions assume that the numbers will be XXXX-Y , where Y always a number between 0 and 9 (perhaps this is a requirement, but it is not clear in the question). In this case, we work with Strings , so 1234-15 will be below 1234-7 . You need to sort Arrays digitally. If we use the following Array with the current solutions on the page, these will be the following results:

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

The number 14670-7 was dropped because it is greater than 14670-10 and 14670-20 as a String .

Here you have a solution that first orders Array and then decreases the values ​​to get lower (this solution changes the order of the original 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 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) ); 

This is another solution a little longer, but it keeps the order of the original 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) ); 
0
source

Source: https://habr.com/ru/post/1264669/


All Articles