2016-11-17 76 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)