循环遍历一个对象数组不会停止if语句

时间:2017-11-24 09:46:48

标签: arrays ajax loops foreach

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

  • for loop
  • 一些
  • 的forEach

函数中的参数是从其他函数获取变量,我正在使用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++;      
             }
        });
    }
}

1 个答案:

答案 0 :(得分:0)

你几乎是正确的,只需要在找到匹配并希望循环停止时返回true。在MDN Array.prototype.some() -

进行了更好的解释
  

some()为每个存在的元素执行一次回调函数   在数组中,直到找到一个回调返回 truthy值的。   如果找到这样的元素,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++;      
    }