通过getElementsByTagName将indexOf用于HTML选择元素

时间:2015-09-27 22:45:29

标签: javascript dom indexof 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]
    }
}

1 个答案:

答案 0 :(得分:1)

Array.prototype.indexOf在要比较的值上调用 toString 后执行严格相等。您正在处理主机(DOM)对象,调用其 toString 方法(如果有的话)的结果是依赖于实现的。

你试过了吗?

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

如果结果是 function ,调用它可能会返回如下内容:

"[object HTMLSelectElement]"

"object"

或浏览器开发人员认为的任何其他内容都是个好主意。但它可能会为 selarray 的每个成员返回相同的值。

您尚未显示 allProbs 的值是什么,但除非它们是selarray[j].toString()返回的精确字符串匹配,否则您将获得-1,并且如果它匹配,你将总是得到0(即第一个)。

修改

因此,基于 allProbs 中的值为字符串,您将永远不会得到匹配,因为您实际上在寻找:

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

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

您可以使用Array.prototype.findIndex(ECMAScript 2015中的新方法,因此可能需要polyfill),这类似于 indexOf ,但使用函数来确定匹配。

据推测,您正在尝试使用等于 allProbs 成员的值来查找select元素,因此您需要以下内容:

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>