【问题标题】:Angular.forEach does not return the last item in objectAngular.forEach 不返回对象中的最后一项
【发布时间】:2016-06-10 09:39:57
【问题描述】:
       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

【问题讨论】:

标签: javascript angularjs loops foreach


【解决方案1】:

这是我在调试中发现的。

由于您已将 localStorage 的键设置为整数(尽管它将保存为字符串),但对于 jQuery 和 Angular 等库,它们会将其视为数字,并将针对特定大小的对象对其进行迭代。 (这里是 3 个。)

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

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

这里通过将localStorage 的第一个值设置为0 将解决问题。

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

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

更新:

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

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

【讨论】:

  • 或者使用Object.Keys 正确执行,它是为Object.keys(localStorage).forEach(x =&gt; console.log(x)) 设计的。编辑:并不是要降低您的答案(听起来很糟糕)。这是一些很好的研究。
  • 我已经看到了,毫无疑问它会起作用。我已经测试了lodash 甚至可以使用_.forIn,有很多方法可以实现这一点。感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 2017-10-20
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多