у меня есть этот код, и я хочу получить новый массив с атрибутом href каждого элемента массива; возможно, есть другой способ сделать это
let countries = document.querySelectorAll('.el');
let countriesList = Array.prototype.slice.call(countries);
let arra = countriesList.map(link);
function link() {
for(let i = 0; i < countriesList.length; i++) {
countriesList[i].getAttribute('href');
}
}
console.info(arra)<div>
<a class='el' href='italy.php'>Italy</a>
<a class='el' href='france.php'>France</a>
<a class='el' href='japan.php'>Japan</a>
<a class='el' href='china.php'>China</a>
</div>И цикл внутри него ненужен



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете преобразовать список узлов в массив и использовать карту, чтобы получить массив href
let arra = [...document.querySelectorAll('.el')].map(item => item.getAttribute('href'))
console.info(arra)<div>
<a class='el' href='italy.php'>Italy</a>
<a class='el' href='france.php'>France</a>
<a class='el' href='japan.php'>Japan</a>
<a class='el' href='china.php'>China</a>
</div>Функция, передаваемая в map, вызывается один раз для каждого элемента и должна возвращать значение.
let countries = document.querySelectorAll('.el');
let countriesList = Array.prototype.slice.call(countries);
let arra = countriesList.map(link);
function link(country) {
return country.getAttribute('href');
}
console.info(arra)<div>
<a class='el' href='italy.php'>Italy</a>
<a class='el' href='france.php'>France</a>
<a class='el' href='japan.php'>Japan</a>
<a class='el' href='china.php'>China</a>
</div>Вы также можете пропустить карту
let countries = document.querySelectorAll('.el');
let countriesList = Array.prototype.slice.call(countries);
let arra = link();
function link() {
const array = []
for(let i = 0; i < countriesList.length; i++) {
array.push(countriesList[i].getAttribute('href'));
}
return array
}
console.info(arra)<div>
<a class='el' href='italy.php'>Italy</a>
<a class='el' href='france.php'>France</a>
<a class='el' href='japan.php'>Japan</a>
<a class='el' href='china.php'>China</a>
</div>Array.prototype.slice.call(countries); действительно старомодно. Есть как минимум два более элегантных способа сделать это.
Ваша функция link() ничего не возвращает и имеет ненужный цикл.
Кроме того, Array.prototype.slice.call(countries); больше не является элегантным способом получить массив из коллекции. Array.from — безусловно, самый элегантный и наглядный способ. И для выполнения картографии требуется функция! (Спасибо, Ник)
Вот ваш фиксированный код, который все еще использует отдельную функцию для перехода к функции карты Array.from.
const countryLinks = document.querySelectorAll('.el');
// const getCountry= el => el.getAttribute('href').split('.')[0]; // callback
const getCountry = el => el.textContent; // alternative callback
// Array.from is more descriptive than spread, and we can add the callback
const countryArray = Array.from(countryLinks, getCountry);
console.info(countryArray);<div>
<a class='el' href='italy.php'>Italy</a>
<a class='el' href='france.php'>France</a>
<a class='el' href='japan.php'>Japan</a>
<a class='el' href='china.php'>China</a>
</div>Или const countryArray = Array.from(countryLinks, getCountry), чтобы избежать двух итераций.
@NickParsons Ох, здорово! Я использовал Array.from вместо распространения всего несколько месяцев и даже не просматривал документацию, поэтому полностью пропустил Array.from(arrayLike, mapFn). Спасибо!
Вы можете избежать повторной итерации коллекции более одного раза, создав экземпляр пустого массива, а затем поместив в него каждое значение в цикле for...of:
const hrefs = [];
for (const anchor of document.querySelectorAll(".el")) {
hrefs.push(anchor.getAttribute("href"));
}
console.info(hrefs); // ["italy.php", "france.php", "japan.php", "china.php"]<div>
<a class = "el" href = "italy.php">Italy</a>
<a class = "el" href = "france.php">France</a>
<a class = "el" href = "japan.php">Japan</a>
<a class = "el" href = "china.php">China</a>
</div>
Ваша функция ссылки не имеет возвращаемого значения, неудивительно, что она не определена.