【问题标题】:filtering an array of strings过滤字符串数组
【发布时间】:2017-07-15 01:05:15
【问题描述】:

我需要过滤一个数组,但我完全不知道该怎么做。

我需要过滤掉最大的数字。当第一个数字是'XXXX',第二个数字是'XXXX-1' 时,可以认为一个数字更大,然后第二个数字更大。或者如果第一个数字是'XXXX-1',第二个是'XXXX-2',则可以认为它更大,那么第二个最大。

如果数字没有更大的版本,请在下面的示例中查看'2234'。没有'2234-1',因此,'2234' 是同类中最大的,应该删除。

所以以这个(字符串)数组为例:

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

我希望得到这样的结果:

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

【问题讨论】:

    标签: javascript arrays string filtering


    【解决方案1】:

    您可以将项目分组并稍后对其进行排序,然后弹出最后一个并过滤原始数组并查找保存的值。

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

    【讨论】:

      【解决方案2】:

      reduce 和 map 的组合可以一次性完成:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 这是最快的方法!
        • 它改变了顺序。
        【解决方案4】:

        所有当前的解决方案都假定数字为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*)$/;	
            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) );

        【讨论】:

          猜你喜欢
          • 2022-07-04
          • 2021-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-06
          • 2019-04-04
          • 2016-01-11
          • 2015-06-09
          相关资源
          最近更新 更多