通过 getElementsByTagName 为 HTML 选择元素使用 indexOf

Using indexOf for HTML selection elements via getElementsByTagName

正在尝试从数组中删除选择中显示的项目。这是 JSFiddle

var allProbs = []; // This is defined elsewhere
var dropProbs = [];
var j;
var sel = document.getElementsByTagName("select")
var selarray = Array.prototype.slice.call(sel); // Convert nodelist to array
for (j = 0; j < allProbs.length; j++) {
    alert(allProbs[j] + " " + selarray.indexOf(allProbs[j]) ); // all -1 here???
    if (selarray.indexOf(allProbs[j]) == -1) {
        dropProbs[dropProbs.length] = allProbs[j]
    }
}

Array.prototype.indexOf 在对要比较的值调用 toString 之后执行严格相等。您正在处理主机 (DOM) 对象,调用它们的 toString 方法(如果它们有一个)的结果取决于实现。

你试过了吗:

console.log(typeof selarray[j].toString);

如果结果是函数,调用它可能return类似于:

"[object HTMLSelectElement]"

"object"

或者浏览器开发者认为好的其他任何东西。但是对于 selarray.

的每个成员,它可能 return 具有相同的值

你没有显示 allProbs 的值是什么,但是除非它们是任何 selarray[j].toString() return 的精确字符串匹配,否则你'会得到 -1,如果匹配,你总是会得到 0(即第一个)。

编辑

因此,基于 allProbs 中的值是字符串,您将永远无法匹配,因为您正在有效地寻找 where:

allProbs[i] === selarray[j].toString(); 

其中 selarray[j].toString() 总是 returns 上面的值之一(或其他)。

您可以使用 Array.prototype.findIndex (new method in ECMAScript 2015 so a polyfill 可能需要),这类似于 indexOf 但使用函数来确定匹配。

大概您正在尝试查找 select 元素,其值等于 allProbs 的成员,因此您可能需要类似的东西:

var index;
for (var j = 0; j < allProbs.length; j++) {
  index = selarray.findIndex(function(sel) {
    return sel.value == allProbs[j];
  })

  /* do stuff based on value of index */

}

这是一个工作示例:

// Polyfill for Array.prototype.findIndex
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 allProbs = ["aaa","bbb","ccc"];
var dropProbs = [];
var sel = document.getElementsByTagName("select");
var selarray = Array.prototype.slice.call(sel);

for (var index, j = 0; j < allProbs.length; j++) {

    index = selarray.findIndex(function(sel){
      return sel.value == allProbs[j]
    });


    if (index == -1) {
        dropProbs[dropProbs.length] = allProbs[j];
    }
}
document.write('<br>dropProbs: ' + JSON.stringify(dropProbs));
    <select id="sel">
        <option value="aaa" selected>aaa</option>
    </select>