【问题标题】:Replacing underscore or lodash _.each with vanilla for loop用香草 for 循环替换下划线或 lodash _.each
【发布时间】:2015-04-10 21:51:26
【问题描述】:

我想替换下面的代码不再依赖underscore.js或lodash.js的_.each()函数:

function fset(data) {
    _.each(dataDefault, function(item, key) {
        var val = ( data[key] ? data[key] : dataDefault[key] );
        $rootScope.meta[key] = val;
    });
};

理想情况下,我想使用原生 JavaScript for 循环,但我不明白下划线/lodash 中的 _.each() 函数如何替换它...

类似:

for(var i=0; i<data.length;i++) {
    var val = ( data[key] ? data[key] : dataDefault[key] );
    $rootScope.meta[key] = val;
}

但是,我不知道如何通过这种方式获得钥匙和物品......

dataDefault 看起来像:

var dataDefault = {
    title: null,
    description: null
};

调用函数的一个例子是:

meta.fset({
    title: 'Hello world',
    description: 'DESC'
});

【问题讨论】:

    标签: javascript loops ecmascript-6 underscore.js lodash


    【解决方案1】:

    所以,如果我正确解释了您的逻辑,那么您要做的是遍历默认对象中的键,如果您正在检查的对象没有该键,则您要添加该对象的键并将其值分配给默认值,对吗?浏览器级别有什么限制吗?

    如果您确定默认数据对象的外观,最快的方法是使用for..in 循环:

    var data = {}; // or wherever you get it from)
    for (var key in defaultData){
       data[key] = data[key] || defaultData[key];
    }
    

    假设data.key 是非空且非假的。如果 false 或 null 是一个有效值(并且您的默认值不是 null 或 false),那么您需要更加努力地确定键的存在和值的类型。但是根据您的示例,您并不担心这一点。

    【讨论】:

      【解决方案2】:

      试试这个:

      Object.keys(dataDefault).forEach(function (key) { 
          var value = dataDefault[key]
          // iteration code
      })
      

      使用 for..in 你必须使用 hasOwnProperty 来排除继承属性。

      【讨论】:

      • 是的,但并非所有浏览器都支持forEachObject.keys。在他的示例中,无需担心任何继承属性。
      猜你喜欢
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 2015-04-08
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 2019-02-03
      相关资源
      最近更新 更多