为什么我不能在Javascript元素集合上使用Array.forEach?

时间:2016-09-30 17:38:28

标签: javascript arrays ecmascript-6 babel

我正在使用Babel / ES6构建应用程序。我想禁用它的仅查看版本的所有表单元素,所以我这样做了:

let form = document.getElementById('application-form')
let elements = form.elements

我希望能够做到这一点,而不是使用常规的旧for循环(确实有效):

elements.forEach((el) => {
    el.disabled = true
})

但我得到了TypeError: elements.forEach is not a function

奇怪的是,如果我在Chrome开发者控制台中console.log(elements),它就像一个带有一堆input个对象的数组。它不显示对象的Object表示法,并且所有键都是整数。我认为它是某种伪数组,但我甚至不知道如何找到它。

编辑:简短回答它不是数组,它是HTMLCollection。见Why doesn't nodelist have forEach?


* UPDATE *

根据this answernodelist现在有forEach方法!

3 个答案:

答案 0 :(得分:15)

你可以。你只是不能像那样使用,因为HTMLFormControlsCollection给你的form.elements没有forEach属性(这不是一个数组)

无论如何你都可以使用它:

Array.prototype.forEach.call(form.elements, function(element) {
    // ...
});

或者可以能够使用点差表示法:

[...elements].forEach(function(element) {
    // ...
});

...但请注意,它依赖于浏览器中HTMLFormControlsCollection实现 iterable

或者Array.from(你需要一个polyfill,但你标记了ES2015,所以......):

Array.from(elements).forEach(function(element) {
    // ...
});

有关详细信息,请参阅my answer here“array-like”部分。

答案 1 :(得分:1)

无法forEach上使用HMTLCollectionforEach只能用于`array。

替代方案是,使用lodash并执行_.toArray(),这会将HTMLColelction转换为数组。在此之后,您可以对其执行常规数组操作。或者,使用ES6 spread并执行forEach()

像这样,

var a = document.getElementsByTagName('div')
[...a].forEach()

答案 2 :(得分:0)

with data as ( select *, row_number() over ( partition by cast(column_ts as date), datepart(hour, column_ts), datepart(minute, column_ts) / 30 order by column_ts ) as rn ) select * from data where rn = 1; import numpy as np from scipy.optimize import curve_fit from scipy.signal import find_peaks_cwt from math import * peak_indices = find_peaks_cwt(data, *args) #make a fitting function that takes x number of peak widths def makeFunction(indices, data): def fitFunction(x, *args): #sum of gaussian functions with centers at peak_indices and heights at data[peak_indices] plus a constant for background noise (args[-1]) return sum([data[indices[i]]*exp(-((x-indices[i])**2)/(2*args[i]**2)) for i in range(len(peak_indices))])+args[-1] #does my code golfing show? xD return fitFunction f = makeFunction(peak_indices, data) #you must provide the initial guess of "np.ones(len(peak_indices)+1)" for the parameters, because f(x, *args) will otherwise take a variable number of arguments. popt, pcov = curve_fit(f, np.arange(len(data)), data, np.ones(len(peak_indices)+1)) #standard deviations (widths) of each gaussian peak and the average of the background noise stdevs, background = popt[:-1], popt[-1] #covariance of result variables stdevcov, bgcov = pcov[:-1], pcov[-1] form.elementsdocument.getElementsByTagName返回节点列表。

节点列表本质上是一个没有像数组一样的方法的对象。

如果您希望将节点列表用作数组,可以使用document.getElementsByClassNamedocument.querySelectorAll

的oldschool方式



Array.from(NodeList)

Array.prototype.slice.call(NodeList)