如何删除字符串中除了一次'abc'之外的所有内容?

时间:2017-04-13 02:35:25

标签: javascript string

给定字符串'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,但它只针对重复的字母,我想针对特定的子字符串。

7 个答案:

答案 0 :(得分:1)

我建议使用split - filter - join组合,使用普通JavaScript对象存储子字符串集'abc''bac'等等到目前为止遇到的,并且在找到重复时从过滤器返回false,以便从结果中省略它们。

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



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

答案 1 :(得分:1)

使用split('-')删除所有连字符以及filter()indexOf()方法,以返回每个元素中的一个(所有唯一内容,如ES6集)

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

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

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

答案 2 :(得分:0)

尝试以下方法:

var data = 'abc-acb-bac-bca-abc-cab-cab-cba-acb-abc-cab-bca-bca-bac-cba-cab-bca-abc';
var dataArr = data.split('-');
var resArr = [];
dataArr.filter(function(val){
  var i = resArr.findIndex(x => x == val);
  if(i <= -1)
        resArr.push(val);
});
var resData = resArr.join('-');
console.log(resData)

答案 3 :(得分:0)

在破折号上拆分字符串,创建一个由每个条目键入的地图,从地图中获取所有键的数组并加入它们。

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

答案 4 :(得分:0)

我们可以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 :(得分:0)

纯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 :(得分:0)

Regex解决了您的问题:

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

使用类似:

&#13;
&#13;
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');
&#13;
&#13;
&#13;