【问题标题】:loop through an array of objects does not stop on if statement循环遍历对象数组不会在 if 语句上停止
【发布时间】:2017-11-24 09:46:48
【问题描述】:

这是我的第一个问题。我有一个代码,我试图将一个对象添加到本地存储中的数组中。如果它已经存在,我检查它并想要停止循环。但是,这只发生在循环为空时创建的第一个元素上。请你看看我的代码,看看我做错了什么。我试过了:

  • for 循环
  • 一些
  • 为每个

函数中的参数是从其他函数中获取变量,我使用 AJAX 来获取一些数据。我知道 forEach 不接受 return 语句,这就是代码被注释掉的原因。

提前致谢 代码:

var counter = 0;

function bookmarkNewsSource(that, x, data, newsName) {

    myBookmark = {
        count: counter,
        imgNum: x,
        id: data.sources[x].id,
        name: data.sources[x].name
    };

    // check if fullTask already exists
    if (localStorage.getItem("bookmarks") === null) {
        //if not init array     
        var bookmarks = [];     
        //add to an array
        bookmarks.push(myBookmark);
        counter++;
        //set localstorage and convert object to a string
        localStorage.setItem("bookmarks", JSON.stringify(bookmarks));
    } else {
        var bookmarks = JSON.parse(localStorage.getItem("bookmarks"));    
        // bookmarks.forEach((bookmark, index, array) => {
        //     console.log(bookmark, index);
        //     if (newsName == bookmark.name) {
        //         return 'done';
        //     } else {
        //         bookmarks.push(myBookmark);
        //         localStorage.setItem("bookmarks", JSON.stringify(bookmarks));
        //         counter++;      
        //     }
        // });   

        bookmarks.some((bookmark) => {
            if (newsName == bookmark.name) {
                console.log('yes', newsName);
                return false;
            } else {
                 JSON.parse(localStorage.getItem("bookmarks"));  
                 bookmarks.push(myBookmark);
                 localStorage.setItem("bookmarks", JSON.stringify(bookmarks));
                 counter++;      
             }
        });
    }
}

【问题讨论】:

    标签: arrays ajax loops foreach


    【解决方案1】:

    您几乎做对了,只需要在 找到匹配项并希望循环停止时返回 true。最好在MDN Array.prototype.some() 解释 -

    some() 为每个存在的元素执行一次回调函数 直到找到一个回调返回一个真实值的数组。 如果找到这样的元素,some() 立即返回 true

        var bookmarks = JSON.parse(localStorage.getItem("bookmarks"));
        var isPresent = bookmarks.some((bookmark) => {
            if (newsName == bookmark.name) {
                console.log('Match Found', newsName);
                return true; //Exit loop and stop going through further elements.
            }
        });
    
        if (!isPresent) {
                 bookmarks.push(myBookmark);
                 localStorage.setItem("bookmarks", JSON.stringify(bookmarks));
                 counter++;      
        }
    

    【讨论】:

    • 谢谢你的回答,我改了还是不行。问题是它仅在数组中的第一个元素(对象)上正确执行。它只添加一次。但是,当我尝试添加更多时,它会失败并继续这样做。我还检查了索引,它正确地从 if 语句迭代和记录代码,但它仍然继续到 else 语句。我猜某事一定是错的。
    • 哦,我明白了,仔细查看您的代码后,问题似乎是由于else 内的some(),我现在已经更新以包含它。
    • 太好了,成功了!!我尝试了不同的方法,但我想我离正确答案不远了。只需将代码放在正确的位置即可:D 谢谢!
    猜你喜欢
    • 2019-06-25
    • 2012-09-24
    • 1970-01-01
    • 2017-07-24
    • 2015-10-03
    • 2016-06-21
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    相关资源
    最近更新 更多