Angular.forEach不返回对象

时间:2016-06-10 09:39:57

标签: javascript angularjs loops foreach

       var items = [];

        //angular.forEach(localStorage, function(value, key){
        //    items.push({
        //        'id'    : key,
        //        'text'  : value
        //    });
        //    console.log(value);
        //});
        for(var key in localStorage){
            if(localStorage.hasOwnProperty(key)){
                //console.log(localStorage[row]);
                items.push({
                    'id'    : key,
                    'text'  : localStorage[key]
                });
            }
        }
        return items;

注释代码返回两个元素的数组,而简单的“for in”循环返回localStorage对象的所有值(实际上有三个项目)。

我不明白为什么地狱angular.forEach不会迭代对象中的最后一项?

根据文档,一切都应该没问题 https://docs.angularjs.org/api/ng/function/angular.forEach

1 个答案:

答案 0 :(得分:3)

这是我从调试中发现的内容。

由于您已将localStorage的键设置为整数(尽管它将保存为字符串),但对于像jQuery和Angular这样的库,它们会将其视为数字,并将在对象上迭代该特定大小的宾语。 (在你的情况下这里有3个。)

通过使用jQuery(https://jsfiddle.net/9n4btgob/)打印所有值,它也将0作为输出,并且它的值未定义。所以迭代将在2点结束。

因此,角度使用jQlite,因此它将输出相同的结果。 https://jsfiddle.net/hru2k47u/

通过将localStorage的第一个值设置为0,可以解决问题。

使用角度:https://jsfiddle.net/hru2k47u/1/
使用jQuery:https://jsfiddle.net/9n4btgob/2/

OR

你可以在键上附加任何字母。

更新

调试jQuery之后,我发现isArrayLike函数导致了问题。因为对于键是数字的localStorage,此函数返回true,因此它将开始循环直到它的长度并迭代它。所以Last属性不会执行。

if ( isArrayLike( obj ) ) {
            length = obj.length;
            for ( ; i < length; i++ ) {
                if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
                    break;
                }
            }
        }