【问题标题】:How to remove all but one occurrences of 'abc' in a string?如何删除字符串中除一次之外的所有“abc”?
【发布时间】:2017-04-13 11:13:08
【问题描述】:

给定字符串'abc-acb-bac-bca-abc-cab-cab-cba-acb-abc-cab-bca-bca-bac-cba-cab-bca-abc',我如何删除除abcacb 之一之外的所有多次出现...

var str = 'abc-acb-bac-bca-abc-cab-cab-cba-acb-abc-cab-bca-bca-bac-cba-cab-bca-abc'

remove('abc-acb-bac-bca-abc-cab-cab-cba-acb-abc-cab-bca-bca-bac-cba-cab-bca-abc') 
//=> 'abc-acb-bac-bca-cab-cba'

我看到了this question about removing duplicate characters from a string,但它只处理重复的字母,我想针对特定的子字符串。

【问题讨论】:

  • 你应该只拆分-上的字符串并制作一个唯一的值列表

标签: javascript string


【解决方案1】:

我建议使用split-filter-join 组合,使用纯 JavaScript 对象来存储到目前为止遇到的子字符串集('abc''bac' 等),然后返回false from filter 当发现重复时将它们从结果中省略。

这具有相对于字符串长度以线性 ( O(n) ) 时间运行的额外好处,而大多数使用 indexOf 的解决方案在O(n2) 的复杂度要慢得多。

function remove (string) {
  return string.split('-').filter(function (e) {
    return !this[e] && (this[e] = true)
  }, {}).join('-')
}
console.log(remove('abc-acb-bac-bca-abc-cab-cab-cba-acb-abc-cab-bca-bca-bac-cba-cab-bca-abc'))

编辑:对于任何感到困惑的人,上面示例中对this 的引用指的是作为the second argument to filter 传递的{}

【讨论】:

  • 这是传递给filter的第二个参数,一个普通的JS对象作为集合使用。
  • (请注意,上面的评论是为了回应现在已被删除的评论。我不自言自语......大部分时间。)
【解决方案2】:

使用split('-') 删除所有连字符,使用filter()indexOf() 方法返回每个元素之一(所有元素都像ES6 Set 一样唯一)

刚刚提到 ES6 Set 让我想起了一种从数组中提取唯一值的更简单方法。请参阅代码段 2。

片段 1

const str = `abc-acb-bac-bca-abc-cab-cab-cba-acb-abc-cab-bca-bca-bac-cba-cab-bca-abc`;

// Use split on every hyphen
const arr = str.split('-');

// Pass arr into function...
function arrayUnique(arr) {

    // Filter arr with the results of...
    return arr.filter(function(ele, idx, arr) {
    
        /* ...the indexOf the current object 
        || for each iteration, return only
        || if it matches current index
        */
        return arr.indexOf(ele) === idx;
    });
}

const res = arrayUnique(arr);

console.log(res);

片段 2

const str = `abc-acb-bac-bca-abc-cab-cab-cba-acb-abc-cab-bca-bca-bac-cba-cab-bca-abc`;

// split('-') to remove all hyphens
const arr = str.split('-');

/* Use the Set Constructor
|| passing arr through an iterator
|| converting arr to a Set
|| a Set can only have unique 
|| values
*/
const set = new Set(arr);

// Do not use the SO Console, use the browser's console
console.log(set);

【讨论】:

    【解决方案3】:

    拆分破折号上的字符串,创建一个以每个条目为键的映射,从映射中获取所有键的数组并将它们连接起来。

    function remove(str) {
      var map = {};
      str.split('-').forEach(
        piece => map[piece] = true
      );
      return Object.keys(map).join('-');
    }
    

    【讨论】:

      【解决方案4】:

      我们可以将split字符串放入一个以-为分隔符的数组中,然后在数组中找到唯一的元素。然后只需将join 数组转换回字符串,分隔符为-

      // Function we'll use to get unique elements
      Array.prototype.getUnique = function() {
        var n = [];
        for (var i = 0; i < this.length; i++) {
          if (n.indexOf(this[i]) == -1) n.push(this[i]);
        }
        return n;
      }
      
      
      var str = 'abc-acb-bac-bca-abc-cab-cab-cba-acb-abc-cab-bca-bca-bac-cba-cab-bca-abc'
      var arr = str.split('-');
      var arrUniq = arr.getUnique();
      console.log(arrUniq.join('-'));

      【讨论】:

        【解决方案5】:

        纯 JavaScript !

        var str = 'abc-acb-bac-bca-abc-cab-cab-cba-acb-abc-cab-bca-bca-bac-cba-cab-bca-abc';
        str = str.split('-');
        
        uniqueArray = str.filter(function(item, pos) {
          return str.indexOf(item) == pos;
        })
        
        str = uniqueArray.join('-');
        
        console.log(str);

        【讨论】:

          【解决方案6】:

          这个Regex 解决了你的问题:

          /(\b\w+\b)-(?=.*\1)/g
          

          像这样使用:

          function removeDuplicates(str){
          	
            return str.replace(/(\b\w+\b)-(?=.*\1)/g, '');
          }
          
            removeDuplicates('abc-acb-bac-bca-abc-cab-cab-cba-acb-abc-cab-bca-bca-bac-cba-cab-bca-abc');

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-02-01
            • 1970-01-01
            • 2011-06-23
            • 1970-01-01
            • 2018-07-08
            相关资源
            最近更新 更多