如果(数组名称)来自输入值IndexOf特定值不起作用

时间:2015-09-23 03:35:08

标签: javascript arrays indexof

我有html表单,用户输入日期。

我需要脚本识别输入日期是否等于数组中的某个日期(“takeOverArray [”tz27092015“,”tz21102015“,”tz26092015“]”)(这是有效的)但是..

每个数组值([“tz27092015”,“tz21102015”,“tz26092015”])也是数组(日期时间)。

所以完整数组是:takeOverArray [“tz27092015 [”mor“,”lun“]”,“tz21102015 [”lun“]”,“tz26092015 [”eve“]”]

现在,我需要从表单输入日期等于(例如:)“tz27092015”下一个脚本将查找数组“tz27092015”是否具有特定单词:“mor”,“lun”或“eve”。 (这不起作用:(那是我的问题)

我的代码:

function checkTimeFunction() {
 var iddate= document.getElementById("takeover_date").value; //takeover_date(input from html form)
 var checkTime = "tz" + iddate.split('.').join('');

 if(takeOverArray.indexOf(checkTime, 0) !== -1) //That's working  {
    console.log("date found");

    if (checkTime.indexOf("mor", 0) !== -1) //That's NOT working {

        console.log("morning disabled");

    };
 }
})

所以我的问题是,为什么

if (checkTime.indexOf("mor", 0) == 0)

不能像上面的“indexOf”那样工作。我怎么能解决这个问题。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

所以 takeOverArray 是一个包含值字符串的数组:

var takeOverArray = ["tz27092015['mor','lun']",
                     "tz21102015['lun']",
                     "tz26092015['eve']"];

因此,如果用户选择,例如,2015年9月27日,则 iddate 的值将为:

var iddate = '27.09.2015';

使用替换转换与 takeOverArray 中的值兼容的格式:

var checkTime = 'tz' + iddate.replace(/\./g,'');

现在您无法使用 indexOf ,因为它使用与数组值严格相等,而您希望仅将 checkTime 与部分值匹配。为此,您可以使用Array.prototype.findIndex。这是ECMAScript 2015功能,但您可以找到polyfill on MDN

首先,您要查找匹配元素的索引:

var index = takeOverArray.findIndex(function(v) {
  return checkTime.indexOf(v) != -1;
})

现在,如果找到合适的值, index 将是该值的索引,如果未找到,则为-1。所以现在:

if (index != -1) {
  console.log("date found");

  // Test if the value at that index contains 'mor'
  if (takeOverArray[index].indexOf('mor') != -1) {
    console.log("morning disabled");
  }
} else {
  console.log("date not found");
}       

你已经完成了。这是可运行的代码(需要支持 findIndex ):

// Array.prototype.findIndex polyfill from MDN
if (!Array.prototype.findIndex) {
  Array.prototype.findIndex = function(predicate) {
    if (this === null) {
      throw new TypeError('Array.prototype.findIndex called on null or undefined');
    }
    if (typeof predicate !== 'function') {
      throw new TypeError('predicate must be a function');
    }
    var list = Object(this);
    var length = list.length >>> 0;
    var thisArg = arguments[1];
    var value;

    for (var i = 0; i < length; i++) {
      value = list[i];
      if (predicate.call(thisArg, value, i, list)) {
        return i;
      }
    }
    return -1;
  };
}



    var takeOverArray = ["tz27092015['mor','lun']",
                         "tz21102015['lun']",
                         "tz26092015['eve']"];

    var iddate = '27.09.2015';
    var checkTime = 'tz' + iddate.replace(/\./g,'');
    var index = takeOverArray.findIndex(function(v) {
      return v.indexOf(checkTime) != -1;
    })
    
    if (index != -1) {
      document.write("date found");

      // Test if the value at that index contains 'mor'
      if (takeOverArray[index].indexOf('mor') != -1) {
        document.write("morning disabled");
      }
    } else {
      document.write(checkTime + " not found");
    }