2017-05-04 69 views
2

我目前正在一個項目中工作,在那裏我需要比較這兩個數組並篩選出具有相同房間名稱的數組;JavaScript - 使用相同字符串比較兩個數組

(例如; A420.2 - 0H53米(從空置 -array)和A420.2(從預訂 -array))。

var vacant = [ 

A210.3 - 0h 53 m 
,A510.2 - 0h 53 m 
,A510.4 - 0h 53 m 
,A340.2 - 0h 53 m 
,A420.2 - 0h 53 m 
,A450.1 - 1h 53 m 
,A250.1 - 1h 53 m 
,A520.7 - 2h 53 m 
,A510.2 - 2h 53 m 
,A240.2 - 2h 53 m 
,A440.2 - 2h 53 m 
,A350.1 - 4h 38 m 
,A250.1 - 4h 53 m 
,A450.3 - 4h 53 m 
,A340.1 - 4h 53 m 
,A320.6 - 4h 53 m 
,A210.2 - 5h 38 m 
,A240.2 - 6h 53 m 
,A240.4 - 6h 53 m]; 

var booked = [ 

A130.1 
,A420.6 
,A440.5 
,A540.1 
,A250.1 
,A350.1 
,A420.2 
,A510.2 
,A320.6 
,A320.7 
,A210.2 
,A220.3]; 

過濾後的結果應該如下所示:

var filtered = [ 

A210.3 - 0h 53 m 
,A510.4 - 0h 53 m 
,A340.2 - 0h 53 m 
,A450.1 - 1h 53 m 
,A250.1 - 1h 53 m 
,A520.7 - 2h 53 m 
,A240.2 - 2h 53 m 
,A440.2 - 2h 53 m 
,A450.3 - 4h 53 m 
,A340.1 - 4h 53 m 
,A320.6 - 4h 53 m 
,A240.2 - 6h 53 m 
,A240.4 - 6h 53 m]; 

// Filtered out: A250.1, A510.2, A210.2, A420.2, A350.1 

我試過幾個不同的方法,我已經從類似的問題發現了,但我沒有得到我一直在尋找的結果。例如;

function arr_diff (booked, vacant) { 

    var a = [], diff = []; 

    for (var i = 0; i < booked.length; i++) { 
     a[booked[i]] = true; 
    } 

    for (var i = 0; i < vacant.length; i++) { 
     if (a[vacant[i]]) { 
      delete a[vacant[i]]; 
     } else { 
      a[vacant[i]] = true; 
     } 
    } 

    for (var k in a) { 
     diff.push(k); 
    } 

    return diff; 
}; 

感謝所有的答案,它真的幫助了很多,我得到了我的代碼工作。無論如何,我有一個後續問題給你;

如果已過濾的數組有兩個相同的名稱,例如;

FRAMIA250.1 - 0h 34 m 
FRAMIA450.1 - 0h 34 m 
FRAMIA240.2 - 1h 34 m 
FRAMIA510.2 - 1h 34 m 
FRAMIA440.2 - 1h 34 m 
FRAMIA520.7 - 1h 34 m 
FRAMIA350.1 - 3h 19 m 
FRAMIA450.3 - 3h 34 m 
FRAMIA340.1 - 3h 34 m 
FRAMIA250.1 - 3h 34 m 
FRAMIA320.6 - 3h 34 m 
FRAMIA210.2 - 4h 19 m 
FRAMIA240.4 - 5h 34 m 
FRAMIA240.2 - 5h 34 m 

因此,我們必須在這裏FRAMIA250.1 - 0H34米FRAMIA250.1 - 3H34米。什麼是最有效的方法來過濾第二個同名(FRAMIA250.1 - 3小時34米)直到時間從第一個(FRAMIA250.1 - 0小時34米)到期?

要澄清;當時間到期時,它不再顯示過濾數組中的元素。

+1

這些都是無效的數組 – Weedoze

+0

@Weedoze我已經將這些元素推入了這些數組中,其中預訂.push(resource.code); –

+0

你需要陣列中的
嗎?這是計算相似性的額外開銷。 –

回答

4

使用Array#filter()Array#find()

var vacant=["A210.3 - 0h 53 m","A510.2 - 0h 53 m","A510.4 - 0h 53 m","A340.2 - 0h 53 m","A420.2 - 0h 53 m","A450.1 - 1h 53 m","A250.1 - 1h 53 m","A520.7 - 2h 53 m","A510.2 - 2h 53 m","A240.2 - 2h 53 m","A440.2 - 2h 53 m","A350.1 - 4h 38 m","A250.1 - 4h 53 m","A450.3 - 4h 53 m","A340.1 - 4h 53 m","A320.6 - 4h 53 m","A210.2 - 5h 38 m","A240.2 - 6h 53 m","A240.4 - 6h 53 m"], 
 
booked=["A130.1","A420.6","A440.5","A540.1","A250.1","A350.1","A420.2","A510.2","A320.6","A320.7","A210.2","A220.3"]; 
 

 
var filtered = vacant.filter(v=>!booked.find(b=>b===v.split('-')[0].trim())); 
 
console.log(filtered);

+0

謝謝你,這工作得很好。如果可能,你還可以檢查我的後續問題嗎? –

+0

@ Destiny_Coder_88你的後續問題是完全不同的。請通過接受我的回答來關閉此問題,然後在SO – Weedoze

1

使用filterincludes象下面這樣:

var vacant = ['A210.3 - 0h 53 m' 
 
,'A510.2 - 0h 53 m' 
 
,'A510.4 - 0h 53 m' 
 
,'A340.2 - 0h 53 m' 
 
,'A420.2 - 0h 53 m' 
 
,'A450.1 - 1h 53 m' 
 
,'A250.1 - 1h 53 m' 
 
,'A520.7 - 2h 53 m' 
 
,'A510.2 - 2h 53 m' 
 
,'A240.2 - 2h 53 m' 
 
,'A440.2 - 2h 53 m' 
 
,'A350.1 - 4h 38 m' 
 
,'A250.1 - 4h 53 m' 
 
,'A450.3 - 4h 53 m' 
 
,'A340.1 - 4h 53 m' 
 
,'A320.6 - 4h 53 m' 
 
,'A210.2 - 5h 38 m' 
 
,'A240.2 - 6h 53 m' 
 
,'A240.4 - 6h 53 m']; 
 

 
var booked = ['A130.1' 
 
,'A420.6' 
 
,'A440.5' 
 
,'A540.1' 
 
,'A250.1' 
 
,'A350.1' 
 
,'A420.2' 
 
,'A510.2' 
 
,'A320.6' 
 
,'A320.7' 
 
,'A210.2' 
 
,'A220.3']; 
 

 

 
var ans = vacant.filter(function (v,i) { 
 
    var toSearch = v.split('-')[0].trim(); 
 
    return !booked.includes(toSearch); 
 
}); 
 

 
console.log(ans);

+0

'booked.includes(toSearch)上創建另一個問題?假:真;'...來吧,不要那個傢伙 – Weedoze

+0

@Weedoze對不起,沒有得到你? –

+0

使用'!'返回相反,而不是使用三元運算符'!booked.includes(toSearch)' - 就像編碼'if(value === true)' – Weedoze

0

我會首先創建一個ES6 Set更快的查找和使用,作爲this用於過濾的回調:

const vacant=["A210.3 - 0h 53 m","A510.2 - 0h 53 m","A510.4 - 0h 53 m","A340.2 - 0h 53 m","A420.2 - 0h 53 m","A450.1 - 1h 53 m","A250.1 - 1h 53 m","A520.7 - 2h 53 m","A510.2 - 2h 53 m","A240.2 - 2h 53 m","A440.2 - 2h 53 m","A350.1 - 4h 38 m","A250.1 - 4h 53 m","A450.3 - 4h 53 m","A340.1 - 4h 53 m","A320.6 - 4h 53 m","A210.2 - 5h 38 m","A240.2 - 6h 53 m","A240.4 - 6h 53 m"], 
 
     booked=["A130.1","A420.6","A440.5","A540.1","A250.1","A350.1","A420.2","A510.2","A320.6","A320.7","A210.2","A220.3"] 
 
     filtered = vacant.filter(function (v) { 
 
      return !this.has(v.split('-')[0].trim()) 
 
     }, new Set(booked)); 
 
console.log(filtered);
.as-console-wrapper { max-height: 100% !important; top: 0; }

0
如果基本上你想只篩選出那些空置它們

也是在訂票,如果我這樣做是正確:

function filterVacancies(vacant, booked) { 
    return vacant.filter(function(vacancy){ 
    // now let's search in booked if some element "starts with" the room number 
    return booked.some(function(booking){ 
     return vacancy.startsWith(booking); 
    }); 
    }) 
} 
0
var vacant= [ 
"A210.3 - 0h 53 m" 
,"A510.2 - 0h 53 m" 
,"A510.4 - 0h 53 m" 
,"A340.2 - 0h 53 m" 
,"A420.2 - 0h 53 m" 
,"A450.1 - 1h 53 m" 
,"A250.1 - 1h 53 m" 
,"A520.7 - 2h 53 m" 
,"A510.2 - 2h 53 m" 
,"A240.2 - 2h 53 m" 
,"A440.2 - 2h 53 m" 
,"A350.1 - 4h 38 m" 
,"A250.1 - 4h 53 m" 
,"A450.3 - 4h 53 m" 
,"A340.1 - 4h 53 m" 
,"A320.6 - 4h 53 m" 
,"A210.2 - 5h 38 m" 
,"A240.2 - 6h 53 m" 
,"A240.4 - 6h 53 m"]; 

var booked = [ 
"A130.1" 
,"A420.6" 
,"A440.5" 
,"A540.1" 
,"A250.1" 
,"A350.1" 
,"A420.2" 
,"A510.2" 
,"A320.6" 
,"A320.7" 
,"A210.2" 
,"A220.3"]; 

var filtered = []; 

for(var i=0;i<vacant.length;i++){ 
var found = false; 
for(var x=0;x<booked.length;x++){ 
    if(vacant[i].indexOf(booked[x]) > -1){ 
    found = true; 
    } 
} 
if(!found){ 
    filtered.push(vacant[i]); 
} 
} 
var result=""; 
for(var y=0;y<filtered.length;y++){ 
result += filtered[y] + "\n<BR>"; 
} 
document.getElementById("demo").innerHTML = result; 
} 
0

I W烏爾德寫:

var vacant = ['A210.3 - 0h 53 m','A510.2 - 0h 53 m','A510.4 - 0h 53 m','A340.2 - 0h 53 m','A420.2 - 0h 53 m','A450.1 - 1h 53 m','A250.1 - 1h 53 m','A520.7 - 2h 53 m','A510.2 - 2h 53 m','A240.2 - 2h 53 m','A440.2 - 2h 53 m','A350.1 - 4h 38 m','A250.1 - 4h 53 m','A450.3 - 4h 53 m','A340.1 - 4h 53 m','A320.6 - 4h 53 m','A210.2 - 5h 38 m','A240.2 - 6h 53 m','A240.4 - 6h 53 m'] 
 
var booked = ['A130.1','A420.6','A440.5','A540.1','A250.1','A350.1','A420.2','A510.2','A320.6','A320.7','A210.2','A220.3'] 
 

 
var filtered = vacant.filter(v => !booked.includes(v.split(" -")[0])) 
 
console.log(filtered)

您篩選的每一個元素使用此項檢查的空置v:如果之前的任何第一串 「 - 」(分割(...)[0] )v找不到(!includes(...))已預訂數組,請保留。

請參閱includes,split,filterlambda