Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.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:遍历数组并修改数组中的项_Javascript_Arrays_Loops - Fatal编程技术网

Javascript:遍历数组并修改数组中的项

Javascript:遍历数组并修改数组中的项,javascript,arrays,loops,Javascript,Arrays,Loops,我正在尝试在我的页面上设置一个函数,该函数将遍历一系列新闻标题,如果标题包含特定标记,则删除标题 标题从WordPress post数据库中提取,并显示在带有ID=“news”的中。每个特定标题都是带有class=“title”的链接。 我首先将所有标题收集到一个数组中,这样我就可以遍历它们,但由于某些原因,它不能正常工作 我的代码是: <script type="text/javascript"> //first I create the array var test_DOM =

我正在尝试在我的页面上设置一个函数,该函数将遍历一系列新闻标题,如果标题包含特定标记,则删除标题

标题从WordPress post数据库中提取,并显示在带有
ID=“news”
中。每个特定标题都是带有
class=“title”
的链接。 我首先将所有标题收集到一个数组中,这样我就可以遍历它们,但由于某些原因,它不能正常工作

我的代码是:

<script type="text/javascript">
//first I create the array
var test_DOM = document.getElementById("news").getElementsByClassName("title");
//then I set the marker
var marker = "[X]"
//then I wirte the function to iterate through the array://
function checkX() {
for(i in test_DOM){
if (i.includes(marker)) {
i = "<del>", i, "</del>";
console.log(test_DOM[i], "changed")
}
console.log(test_DOM[i].innerHTML)
}
};
//and I call the function
checkX()


[x]News 1我想我理解你的意图,并为你找到了解决方案。要使脚本按照您所描述的方式工作,需要更新以下几项内容:

  • 可以使用
    document.querySelectorAll
    缩短DOM查询
  • 使用
    String.includes()
    时,它区分大小写。这意味着
    [x]
    不等于
    [x]
    ,因此请务必检查测试的正确版本
  • 正如@2pha在他们的评论中提到的,
    test\u DOM
    将返回一个
    NodeList
    ,它是一个类似于数组的结构,但不完全是数组。要将其转换为可以按照您的意愿循环的数组,可以使用
    [].slice.call(test\u DOM)
  • 正如@VLAZ在他们的评论中提到的,逗号运算符不会组合字符串。您应该使用
    'string'+'string'
    语法来组合字符串
  • 同样正如@VLAZ所提到的,
    for…in
    循环更适合对象,它将输出对象的键,而不是值,因此这不适合您的用例。您可以改用
    Array.forEach()
  • 正如您提到的,
    Array.includes()
    检查应使用
    innerHTML
    进行检查,然后应使用
    innerHTML
    重置元素的值
  • 我在下面添加了一个片段,并做了一些修改

    var test_DOM=document.queryselectoral('#news.title');
    变量标记='[x]';
    函数checkX(){
    [].slice.call(test_DOM).forEach(function(elem,i){
    if(elem.innerHTML.includes(marker)){
    elem.innerHTML=''+elem.innerHTML+'';
    }
    });
    }
    检查X()
    
    [x] 新闻1
    新闻2
    
    继续我的评论。
    例如,“getElementsByCassName()返回一个“NodeList”对象,而不是预期的数组”。但是它有一个长度属性。
    对代码进行最小的更改以使其正常工作

    //首先我创建数组
    var test_DOM=document.getElementById(“新闻”).getElementsByClassName(“标题”);
    //然后我设置了标记
    var marker=“[X]”
    //日志(test_DOM);
    //然后,我创建函数以遍历数组://
    函数checkX(){
    对于(i=0;i
    
    
    标题1
    [十] 标题2
    标题3
    
    i=“”,i“”
    不组合字符串,它使用并仅返回最后一项。另外,
    i
    不是
    test\u DOM
    的每个值,而是
    test\u DOM
    中的每个键。是否在浏览器控制台中检查了错误?另外,getElementsByCassName()返回一个“NodeList”对象,而不是预期的数组,因此在其上运行for-in循环将运行所有属性,而不仅仅是项索引。NodeList对象确实包含一个与索引长度相对应的length属性,因此像这样的notmal for循环应该可以工作
    for(i=0;i
    @Kik4s嘿,这只是一个友好的提醒,如果答案回答了您的问题,请将其标记为“已接受”。如果下面的两个现有答案不能完全回答您的问题,您可以留下评论以获得更多的澄清。谢谢jackrugile的答案比我的更深刻(一个可能应该是被接受的答案),但是我的答案应该让你很容易理解为什么你的特定代码不起作用。
    [x] News 1
    [EG] News 2
    
    [x] News 1 <- struck through
    [EG] News 2 <- still the same
    
    function checkX() {
    for(i in test_DOM){
    if (i.innerHTML.includes(marker)) {
    i.innerHTML = "<del>", i, "</del>";
    console.log(test_DOM[i], "changed")
    }
    console.log(test_DOM[i].innerHTML)
    }
    };