【问题标题】:Loop over object with forEach (not common for)用 forEach 循环对象(不常见)
【发布时间】:2016-11-28 13:26:34
【问题描述】:

嗨,我有关注对象:

arguments = {
    familyName: undefined,
    givenName: undefined,
    age: undefined
}; 

我想循环每个键并使用每个键:值做一些事情。我试过这样:

this.arguments.forEach((item:any) => {
    if(item == undefined) {
        alert("Hallo");
    }
});

可以这样循环吗?我不会是普通的for,或者我不是在寻找这样的解决方案,我的问题是是否可以像上面的forEach() 那样循环它,以及是否可以这样做。我经常在数组中使用它并且它可以工作,所以我想也许在这样的对象中也是可能的。

谢谢

【问题讨论】:

标签: javascript foreach typescript


【解决方案1】:

没有内置函数可以帮助您迭代对象,但是很容易实现它们:

Object.prototype.forEach = function(callback, context = null) {
  Object.keys(this).forEach((key, index, keys) => {
    if(!this.hasOwnProperty(key)) {
      return;
    }
    
    callback.call(context, key, this[key], index, keys);
  });
    
  return this;
}


let foo = { baz: 1, pippo: 2 };

foo.forEach((key, value, index) => console.log(index, key, value));

ES-NEXT 将提供一些更好的方法:

  1. Symbol.iterator = https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator
  2. Object.entries = https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Object/entries
  3. Object.values = https://developer.mozilla.org/it/docs/Web/JavaScript/Reference/Global_Objects/Object/values

【讨论】:

  • 虽然我真的很喜欢你的回答,但扩展/重载原生类型的原型通常不是一个好主意,所以最好不要推广它。代码是正确的,而且是我自己实际使用的东西,哈哈。
  • 就个人而言,我完全同意你的看法......我不喜欢也从不使用原型内置对象,但是,看看这个问题,我的答案似乎已经调整好了。
【解决方案2】:

forEach 仅适用于数组,而您正在循环对象。

试试这个:

Object.keys(this.arguments).forEach((idx) => {
    var row = this.arguments[idx];
    if (row === undefined) alert('hallo');
});

您确实需要为此使用 es6。

良好的 ol' es5 方法:

for(idx in this.arguments)
{
    if (! this.arguments.hasOwnProperty(idx)) continue;
    if (this.arguments[idx] === undefined) alert('hallo');
}

【讨论】:

    【解决方案3】:

    您可以通过Object.keys 循环获取密钥。

    args = {
        familyName: undefined,
        givenName: undefined,
        age: undefined
    }; 
    
    Object.keys(args).forEach((key/*:string*/) => {
        if(args[key] === undefined) {
            console.log("Hallo");
        }
    });

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 2015-03-27
      • 2010-10-31
      • 1970-01-01
      • 2011-12-20
      • 2015-03-26
      相关资源
      最近更新 更多