尝试从数组中删除选择中显示的项目。这是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]
}
}
答案 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>