我真的专注于这个问题,我找不到我的代码中的任何错误。 我只希望数组包含具有true类的段落的内部文本。 预先感谢。
function x() {
let correct = document.querySelectorAll(
`#circle p`
);
let pArr = Array.prototype.slice.call(correct);
let pCorrectArr = pArr.map(cur => {
if (cur.classList.contains("true")) {
const innerText = cur.innerText;
return innerText;
}
});
return pCorrectArr;
}
console.log(x());
<div id="circle">
<p>Google</p>
<p class="true">Facebook</p>
<p>Microsoft</p>
</div>
答案 0 :(得分:4)
Map将返回一个数组,该数组具有与源数组相同数量的元素。因此,在您的情况下,当您不输入if
条件时,您将返回“ nothing”。 Javascript假定一个函数没有返回任何内容,而没有返回undefined
。
在您的示例中,您的if条件返回string
,而另一种情况仅返回undefined
。这就是为什么您在undefined
中看到预期字符串的原因。
您可以使用reduce
来实现所需的功能,reduce
允许您遍历数组并创建自己的响应。 (您可以返回包含更多项目,更少项目或一个本身不是数组的对象的数组)
这是您的示例代码,已修改为可以与reduce
一起使用。我建议reading up on reduce
here。
function x() {
let correct = document.querySelectorAll(
`#circle p`
);
let pArr = Array.prototype.slice.call(correct);
let pCorrectArr = pArr.reduce(function(acc, cur){
if (cur.classList.contains("true")) {
const innerText = cur.innerText;
acc.push(innerText);
}
return acc;
}, []);
return pCorrectArr;
}
console.log(x());
<div id="circle">
<p>Google</p>
<p class="true">Facebook</p>
<p>Microsoft</p>
</div>
答案 1 :(得分:3)
您可以通过映射此属性来过滤并返回innerText
。
Array#map
为每个项目返回另一个值,但不过滤数组。
在这种情况下,请使用Array#filter
并为所需属性添加一个映射。
function x() {
let correct = document.querySelectorAll('#circle p'); // no need for template strings
return Array.prototype.slice
.call(correct)
.filter(cur => cur.classList.contains("true")) // filter
.map(({ innerText }) => innerText); // map
}
console.log(x());
<div id="circle">
<p>Google</p>
<p class="true">Facebook</p>
<p>Microsoft</p>
</div>