【问题标题】:JavaScript - Deleting multiple identical values between two arraysJavaScript - 删除两个数组之间的多个相同值
【发布时间】:2017-10-08 20:24:39
【问题描述】:

我目前正在编写需要比较两个数组并删除多个同名元素的代码。这是数组;

vacant = [
"FRAMIA420.2 - 0h 36 m",
"FRAMIA510.4 - 0h 36 m",
"FRAMIA320.7 - 0h 36 m",
"FRAMIA520.7 - 0h 36 m",
"FRAMIA450.3 - 1h 36 m",
"FRAMIA350.1 - 2h 21 m",
"FRAMIA210.2 - 2h 21 m",
"FRAMIA340.2 - 2h 36 m"]

booked = [
"FRAMIA440.5 - 13h 0 m",
"FRAMIA540.2 - 3h 45 m",
"FRAMIA340.2 - 5h 45 m",
"FRAMIA250.1 - 3h 45 m",
"FRAMIA420.2 - 3h 45 m",
"FRAMIA540.1 - 13h 0 m",
"FRAMIA520.5 - 3h 45 m",
"FRAMIA240.4 - 3h 45 m",
"FRAMIA510.2 - 7h 0 m",
"FRAMIA510.4 - 2h 45 m",
"FRAMIA520.7 - 2h 45 m",
"FRAMIA450.1 - 1h 45 m",
"FRAMIA450.3 - 2h 0 m"]

所以这两个数组之间的相似元素是:FRAMIA420.2, FRAMIA510.4, FRAMIA520.7, FRAMIA450 .3FRAMIA340.2

我已经过滤掉了一个元素的时间戳部分,所以我只需要比较名称部分;

var firstPart = [];
vacant.forEach(function (obj1) {
    firstPart.push(obj1.substring(0, obj1.indexOf('-')))
});
booked.forEach(function (obj2) {
    var c = firstPart.indexOf(obj2.substring(0, obj2.indexOf('-')));
});

最终结果应该是这样的,只留下vacant -array 内的元素,与booked -array 没有相似之处:

FRAMIA320.7 - 0h 36 m
FRAMIA350.1 - 2h 21 m
FRAMIA210.2 - 2h 21 m

请注意,数组之间的相似性每天都在变化,有时可能有 2 个相似的元素,有时可能有 8 个或更多。

有什么快速有效的方法吗?

【问题讨论】:

    标签: javascript arrays object filter compare


    【解决方案1】:

    您可以在booked 数组中构造一个所有名称的列表,然后遍历空数组,检查该名称是否在预定名称列表中。

    vacant = [
      "FRAMIA420.2 - 0h 36 m",
      "FRAMIA510.4 - 0h 36 m",
      "FRAMIA320.7 - 0h 36 m",
      "FRAMIA520.7 - 0h 36 m",
      "FRAMIA450.3 - 1h 36 m",
      "FRAMIA350.1 - 2h 21 m",
      "FRAMIA210.2 - 2h 21 m",
      "FRAMIA340.2 - 2h 36 m"
    ]
    
    booked = [
      "FRAMIA440.5 - 13h 0 m",
      "FRAMIA540.2 - 3h 45 m",
      "FRAMIA340.2 - 5h 45 m",
      "FRAMIA250.1 - 3h 45 m",
      "FRAMIA420.2 - 3h 45 m",
      "FRAMIA540.1 - 13h 0 m",
      "FRAMIA520.5 - 3h 45 m",
      "FRAMIA240.4 - 3h 45 m",
      "FRAMIA510.2 - 7h 0 m",
      "FRAMIA510.4 - 2h 45 m",
      "FRAMIA520.7 - 2h 45 m",
      "FRAMIA450.1 - 1h 45 m",
      "FRAMIA450.3 - 2h 0 m"
    ]
    
    function getName(str) {
      return str.substring(0, str.indexOf('-'));
    }
    
    var bookedNames = [];
    booked.forEach(function (bookedStr) {
      bookedNames.push(getName(bookedStr))
    });
    
    var uniqueVacant = [];
    vacant.forEach(function (vacantStr) {
      var vacantName = getName(vacantStr);
      if (!bookedNames.includes(vacantName))
        uniqueVacant.push(vacantStr)
    });
    console.log(uniqueVacant);

    【讨论】:

      【解决方案2】:

      你需要 2 个循环,每个数组一个,并比较每个数组的字符串的第一部分,如下所示:

      vacant = [
      "FRAMIA420.2 - 0h 36 m",
      "FRAMIA510.4 - 0h 36 m",
      "FRAMIA320.7 - 0h 36 m",
      "FRAMIA520.7 - 0h 36 m",
      "FRAMIA450.3 - 1h 36 m",
      "FRAMIA350.1 - 2h 21 m",
      "FRAMIA210.2 - 2h 21 m",
      "FRAMIA340.2 - 2h 36 m"]
      
      booked = [
      "FRAMIA440.5 - 13h 0 m",
      "FRAMIA540.2 - 3h 45 m",
      "FRAMIA340.2 - 5h 45 m",
      "FRAMIA250.1 - 3h 45 m",
      "FRAMIA420.2 - 3h 45 m",
      "FRAMIA540.1 - 13h 0 m",
      "FRAMIA520.5 - 3h 45 m",
      "FRAMIA240.4 - 3h 45 m",
      "FRAMIA510.2 - 7h 0 m",
      "FRAMIA510.4 - 2h 45 m",
      "FRAMIA520.7 - 2h 45 m",
      "FRAMIA450.1 - 1h 45 m",
      "FRAMIA450.3 - 2h 0 m"]
      
      for(i=0;i<vacant.length;i++) {
          item1 = vacant[i].split('-')[0];
          for(j=0;j<booked.length;j++) {
              item2 = booked[j].split('-')[0];
              if(item1===item2) {
                      console.log('item number '+i+' in vacant is the same as item number '+j+' in booked');
              }
          }
      }
      

      https://jsfiddle.net/48hef0cz/

      【讨论】:

        【解决方案3】:

        试试这个:

        var vacant = [
        "FRAMIA420.2 - 0h 36 m",
        "FRAMIA510.4 - 0h 36 m",
        "FRAMIA320.7 - 0h 36 m",
        "FRAMIA520.7 - 0h 36 m",
        "FRAMIA450.3 - 1h 36 m",
        "FRAMIA350.1 - 2h 21 m",
        "FRAMIA210.2 - 2h 21 m",
        "FRAMIA340.2 - 2h 36 m"];
        
        var booked = [
        "FRAMIA440.5 - 13h 0 m",
        "FRAMIA540.2 - 3h 45 m",
        "FRAMIA340.2 - 5h 45 m",
        "FRAMIA250.1 - 3h 45 m",
        "FRAMIA420.2 - 3h 45 m",
        "FRAMIA540.1 - 13h 0 m",
        "FRAMIA520.5 - 3h 45 m",
        "FRAMIA240.4 - 3h 45 m",
        "FRAMIA510.2 - 7h 0 m",
        "FRAMIA510.4 - 2h 45 m",
        "FRAMIA520.7 - 2h 45 m",
        "FRAMIA450.1 - 1h 45 m",
        "FRAMIA450.3 - 2h 0 m"];
        
        vacant = vacant.filter(function (element) {
          var roomName = element.split('-')[0];
          
          var index = booked.findIndex(function (booking) {
            return roomName === booking.split('-')[0];
          });
          
          return index == -1;
        });
        
        console.log(vacant);

        【讨论】:

          【解决方案4】:

          您可以使用字典来跟踪唯一值。

          vacant = [
          "FRAMIA420.2 - 0h 36 m",
          "FRAMIA510.4 - 0h 36 m",
          "FRAMIA320.7 - 0h 36 m",
          "FRAMIA520.7 - 0h 36 m",
          "FRAMIA450.3 - 1h 36 m",
          "FRAMIA350.1 - 2h 21 m",
          "FRAMIA210.2 - 2h 21 m",
          "FRAMIA340.2 - 2h 36 m"]
          
          booked = [
          "FRAMIA440.5 - 13h 0 m",
          "FRAMIA540.2 - 3h 45 m",
          "FRAMIA340.2 - 5h 45 m",
          "FRAMIA250.1 - 3h 45 m",
          "FRAMIA420.2 - 3h 45 m",
          "FRAMIA540.1 - 13h 0 m",
          "FRAMIA520.5 - 3h 45 m",
          "FRAMIA240.4 - 3h 45 m",
          "FRAMIA510.2 - 7h 0 m",
          "FRAMIA510.4 - 2h 45 m",
          "FRAMIA520.7 - 2h 45 m",
          "FRAMIA450.1 - 1h 45 m",
          "FRAMIA450.3 - 2h 0 m"]
          
          vacantDict = {};
          
          vacant.forEach(function(val) {
            var name = val.split(' - ')[0];
            vacantDict[name] = val;
          });
          
          booked.forEach(function(val) {
            var name = val.split(' - ')[0];
            if (vacantDict[name] !== undefined) {
              delete vacantDict[name];
            }
          });
          
          newVacantList = [];
          for (var name in vacantDict) {
            newVacantList.push(vacantDict[name]);
          }
          
          console.log(newVacantList);

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-07-15
            • 2021-02-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多