给定字符串'abc-acb-bac-bca-abc-cab-cab-cba-acb-abc-cab-bca-bca-bac-cba-cab-bca-abc'
,如何删除abc
,acb
之一的所有多次出现...
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,但它只针对重复的字母,我想针对特定的子字符串。
答案 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
使用类似:
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;