2016-11-17 77 views
2

我有这两个数组:合并两个字符串数组排除某些值

var a = ['a123', 'a321', 'a444', 'b3132', 'a123']; 
var b = ['b3132', 'a321', 'a444', 'a123', 'a123']; 

而且我想用一个条件合并他们的价值是不是已经在阵列上,当字符“b”是对串,忽略它并继续进行合并,这样的结果将是:

var ab = ['a123', 'a321', 'a444']; 

我有它解决了一个循环检查数组值一个接一个,但我觉得有更好的解决方案。

+0

您是否尝试过的东西? – Itay

回答

4

ES6解决方案 - 使用Set()仅获取唯一项目,spread,然后过滤数组以删除包含b的项目。如果b始终是字符串中的第一个字母,则使用String.prototype.startsWith()而不是Array.prototype.includes()

const a = ['a123', 'a321', 'a444', 'b3132', 'a123']; 
 
const b = ['b3132', 'a321', 'a444', 'a123', 'a123']; 
 

 
const result = [...new Set(a.concat(b))].filter((item) => !item.includes('b')); 
 

 
console.log(result);

+0

哇,看起来很聪明的解决方案。 – Troyer

+3

这是一款ES6解决方案,因此如果您需要支持旧版浏览器,它可能无法正常工作。 –

+0

这是完美的,然后,我建立的应用程序不需要旧的浏览器支持:) – Troyer

3

您可以使用concatfilter做它只是没有循环两个数组

var a = ['a123', 'a321', 'a444', 'b3132', 'a123']; 
 
var b = ['b3132', 'a321', 'a444', 'a123', 'a123']; 
 
var c = a.concat(b); 
 
var d = c.filter(function (item, index) { 
 
    return c.indexOf(item) == index; 
 
}); 
 

 
console.log(d);

1

您可以使用filter()concat()这样。

var a = ['a123', 'a321', 'a444', 'b3132', 'a123']; 
 
var b = ['b3132', 'a321', 'a444', 'a123', 'a123']; 
 

 
var result = a.concat(b).filter(function(e) { 
 
    if (!this[e] && e.indexOf('b') == -1) { 
 
    return this[e] = true; 
 
    } 
 
}, {}) 
 

 
console.log(result)