2017-05-04 35 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