Метод DOM document.querySelectorAll()
(и некоторые другие) возвращаютNodeList
.
Чтобы работать со списком, например, используя forEach()
, NodeList
необходимо сначала преобразовать вArray
.
Какой самый лучший способ преобразовать NodeList
Аня Array
?
javascript
arrays
dom
cc молодой
источник
источник
Ответы:
С ES6 вы можете просто:
const spanList = [...document.querySelectorAll("span")];
источник
Type 'NodeListOf<Element>' must have a '[Symbol.iterator]()' method that returns an iterator.ts(2488)
С ES6 вы можете использовать
Array.from(myNodeList)
. Затем используйте свой любимый метод массива.var myNodeList = document.querySelectorAll('.my-selector'); // ALT 1 Array.from(myNodeList).forEach(function(el) { console.log(el); });
Используйте прокладку ES6, чтобы это работало и в старых браузерах.
Если вы используете транспилятор (например, Babel), есть еще две альтернативы:
var myNodeList = document.querySelectorAll('.my-selector'); // ALT 2 for (var el of myNodeList) { el.classList.add('active'); // or some other action } // ALT 3 [...myNodeList].forEach((el) => { console.log(el); });
источник
Array.from(myNodeList)
можете использовать оболочку Symbol для объекта, поэтому его лучше использовать, потому что его можно использовать.Вы можете преобразовать его в массив, используя
slice
метод изArray
прототипа:var elList = document.querySelectorAll('.viewcount'); elList = Array.prototype.slice.call(elList, 0);
Кроме того, если все, что вам нужно
forEach
, вы можете вызвать это изArray
прототипа, не принуждая его сначала к массиву:var elList = document.querySelectorAll('.viewcount'); Array.prototype.forEach.call(elList, function(el) { console.log(el); });
В ES6 вы можете использовать новую
Array.from
функцию для преобразования его в массив:Array.from(elList).forEach(function(el) { console.log(el); });
В настоящее время это есть только в современных браузерах, но если вы используете службу полифиллов, у вас будет доступ к этой функции во всех направлениях.
Если вы используете транспилятор ES6 , вы можете даже использовать
for..of
вместо него цикл:for (var element of document.querySelectorAll('.some .elements')) { // use element here }
источник
Array.prototype.forEach
вместо[].forEach
, заключается в том, что последний создает новый объект Array, который совершенно не нужен.[]
? Я думаю, что он будет собирать мусор, а влияние на память незначительно, может ли кто-нибудь прокомментировать это?Зачем конвертировать? - просто
call
функция Array прямо на коллекции элементов;)[].forEach.call( $('a'), function( v, i) { // do something });
при условии, что $ - это ваш псевдоним для querySelectorAll , конечно
изменить: ES6 позволяет использовать еще более короткий синтаксис
[...$('a')]
( работает только в Firefox с мая 2014 г. )источник
$
естьquerySelectorAll
..each()
.function $ ( s ) { return document.querySelectorAll(s); }
.$('a').each(function(i, v) {...});
Обновление 2020: nodeList.forEach () теперь является официальным стандартом и поддерживается во всех текущих браузерах.
Старые браузеры могут использовать полифил, указанный ниже.
Это не правда.
.forEach()
работает в текущих браузерах. Если он отсутствует, вы можете использовать полифилл для добавления .forEach () из массива в NodeList, и он отлично работает:if ( ! NodeList.prototype.forEach ) { NodeList.prototype.forEach = Array.prototype.forEach; }
Теперь вы можете запустить:
myNodeList.forEach(function(node){...})
Чтобы перебирать NodeLists так же, как Arrays.
Это дает намного более короткий и чистый код, чем везде .call ().
источник
forEach
специально, я пришел сюда в поискахfilter
filter
, но вы можете дать ему неофициальное имяNodeList.prototype.dbkFilter
или подобное, если вы беспокоитесь о будущем стандарте, использующем другую реализацию.Так должно быть
forEach
? Вы можете просто использоватьfor
цикл для перебора списка:for (var i = 0; i < elementList.length; i++) { doSomethingWith(elementlist.item(i)); }
источник
elementList.item(i)
вы можете просто использоватьelementList[i]
.forEach()
лучший стиль программирования и менее подробный - ymmvfor (var oElement, i = 0; oElement = aMenuItemsElements; i++ { console.log(oElement); }
for (var i…)
цикл, потому что цикл for не создает свою собственную область видимости (как сейчас в C / C ++). А потомi
перепутались.ES6 позволяет использовать такие классные способы, как,
var nodeArray = Array.from(nodeList)
но мой любимый - новый оператор распространения.var nodeArray = Array(...nodeList);
источник
Это работало со мной в ES6
Предположим, у вас есть такой нодлист
<ul> <li data-time="5:17">Flexbox video</li> <li data-time="8:22">Flexbox video</li> <li data-time="3:24">Redux video</li> <li data-time="5:17">Flexbox video</li> <li data-time="7:17">Flexbox video</li> <li data-time="4:17">Flexbox video</li> <li data-time="2:17">Redux video</li> <li data-time="7:17">Flexbox video</li> <li data-time="9:54">Flexbox video</li> <li data-time="5:53">Flexbox video</li> <li data-time="7:32">Flexbox video</li> <li data-time="2:47">Redux video</li> <li data-time="9:17">Flexbox video</li> </ul> const items = Array.from(document.querySelectorAll('[data-time]')); console.log(items);
источник
Я использую следующее, потому что считаю, что его легче всего читать:
const elements = document.getElementsByClassName('element'); [...elements].forEach((element) => { // code });
источник
У меня тоже работает:
const elements = Object.values( document.querySelector(your selector here) )
Object.values()
возвращаетArray
значения данного объекта.NodeList
является объектом, как и все в JS.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values
Но он несовместим с IE, так что я думаю,
Array.prototype.*array_method*.call(yourNodeList)
это лучший вариант. С его помощью вы можете вызвать любой метод массива на своемNodeList
источник
Предполагая, что elems - это nodeList:
var elems = document.querySelectorAll('select option:checked');
тогда его можно превратить в массив следующим образом:
var values = [].map.call(elems, function(obj) { return obj.value; });
Ссылка: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Example:_using_map_generically_querySelectorAll
источник