Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么lodash.filter方法适用于选择选项,而不是vanilla js';s过滤法?_Javascript_Ecmascript 5 - Fatal编程技术网

Javascript 为什么lodash.filter方法适用于选择选项,而不是vanilla js';s过滤法?

Javascript 为什么lodash.filter方法适用于选择选项,而不是vanilla js';s过滤法?,javascript,ecmascript-5,Javascript,Ecmascript 5,当我想在options对象上使用JSES5过滤器方法时,下面的代码会触发一个错误 var selectObject = element.querySelector(".selectorClass"); let defaultOption = selectObject .options.filter(option => { return option.value === "Wanted Value"; })[0]; JavaScript运行时错误:对象不支持属性或

当我想在options对象上使用JSES5过滤器方法时,下面的代码会触发一个错误

var selectObject = element.querySelector(".selectorClass");
let defaultOption = selectObject .options.filter(option => {
         return option.value === "Wanted Value";
    })[0];
JavaScript运行时错误:对象不支持属性或方法 “过滤器”

但是,如果我用lodash尝试相同的代码,一切都很好

  var selectObject = element.querySelector(".selectorClass");
  var defaultOption = _.filter(selectObject .options, (option: any) => {
         return option.value === "Wanted Value";
  })[0];

您知道为什么以及可能如何在ecma脚本5中的选择选项上使用filter吗?

在VanillaJS中,
filter
只是属于
数组的一种方法,因此当您尝试在
对象上使用
filter
时,您将得到一个错误


在VanillaJS中,
filter
只是属于
Array
的一种方法,因此当您尝试在
对象上使用
filter
时,您将得到一个错误


原因是如果lodash是对象,它将自动按关键帧过滤。 试试这个:

Object.keys(selectObject.options).filter( key => 
    selectObject.options[key] === 'Wanted Value');

原因是如果lodash是对象,它将自动按关键帧过滤。 试试这个:

Object.keys(selectObject.options).filter( key => 
    selectObject.options[key] === 'Wanted Value');

在某些情况下,在DOM中,您将收到一些看起来像数组的东西,但实际上不是。因此,在您的例子中,
选项
类似于数组。要了解有关这些对象的更多信息,请参见

要解决此问题,可以
将其切片到实际数组中

const myOptions = Array.prototype.slice.call(selectObject.options)

如果您使用的是es6,那么还可以使用以下命令

// Spread operator
[...selectObject.options].forEach(callback);

// Array.from()
Array.from(selectObject.options).forEach(callback);

// for...of statement
for (var option of selectObject.options) callback(option);

在某些情况下,在DOM中,您将收到看起来像数组的内容,但实际上不是。因此,在您的例子中,
选项
类似于数组。要了解有关这些对象的更多信息,请参见

要解决此问题,可以
将其切片到实际数组中

const myOptions = Array.prototype.slice.call(selectObject.options)

如果您使用的是es6,那么还可以使用以下命令

// Spread operator
[...selectObject.options].forEach(callback);

// Array.from()
Array.from(selectObject.options).forEach(callback);

// for...of statement
for (var option of selectObject.options) callback(option);

值得赞扬的是

实际上,我们这里讨论的不是对象,而是dom中类似数组的对象。所以在他的例子中,他说的是
选项
,它类似于数组,而不是真正的对象。@Luke不能真正理解你所说的
类似于数组
,我只知道JSLook into NodeList中有一个有限的基元
类型
。可以对它进行迭代,但它不是数组。它被称为类数组,因为它可能实现迭代器@请看,实际上我们在这里讨论的不是对象,而是dom中类似数组的对象。所以在他的例子中,他说的是
选项
,它类似于数组,而不是真正的对象。@Luke不能真正理解你所说的
类似于数组
,我只知道JSLook into NodeList中有一个有限的基元
类型
。可以对它进行迭代,但它不是数组。它被称为类数组,因为它可能实现迭代器@看见