【问题标题】:JavaScript - Comparing two arrays with same stringsJavaScript - 比较具有相同字符串的两个数组
【发布时间】:2017-10-02 08:09:29
【问题描述】:

我目前正在做一个项目,我需要比较这两个数组并过滤掉房间名称相同的数组;

(例如;A420.2 - 0h 53 m(来自 vacant -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 - 0h 34 mFRAMIA250.1 - 3h 34 m。过滤出具有相同名称的第二个(FRAMIA250.1 - 3h 34 m)直到第一个(FRAMIA250.1 - 0h 34 m)的时间到期的最有效方法是什么?

澄清;当时间到期时,它不再显示过滤数组中的元素。

【问题讨论】:

  • 这些不是有效的数组
  • @Weedoze 我已将这些元素推送到这些数组中,booked.push(resource.code);
  • 你的数组中需要
    吗?这是计算相似度的额外开销。

标签: javascript arrays list compare


【解决方案1】:

如果基本上你想从空置中过滤掉那些也在预订中的,如果我没记错的话:

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);
    });
  })
}

【讨论】:

    【解决方案2】:

    我会写:

    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)

    您使用以下检查过滤 vacant 的每个元素 v:如果 booked 数组中找不到 em>v (!includes(...)),保留它。

    请参阅includessplitfilterlambda

    【讨论】:

      【解决方案3】:
      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;
      }
      

      【讨论】:

        【解决方案4】:

        我将首先创建一个 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; }

        【讨论】:

          【解决方案5】:

          使用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);

          【讨论】:

          • booked.includes(toSearch) ? false : true;...别当那种人了
          • @Weedoze 抱歉,没听懂?
          • 使用! 来返回相反的结果,而不是使用三元运算符!booked.includes(toSearch) - 就像编码if(value===true)
          • @PankajShukla 谢谢你的回答。如果可能的话,你能检查我的后续问题吗?
          • @Destiny_Coder_88 抱歉,我不清楚您的后续问题。
          【解决方案6】:

          使用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);

          【讨论】:

          • 谢谢你,这很好。如果可能的话,你能检查我的后续问题吗?
          • @Destiny_Coder_88 你的后续问题完全不同。请通过接受我的回答来结束这个问题,然后在 SO 上创建另一个问题
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-11
          相关资源
          最近更新 更多