关于javascript:用vanilla for循环替换下划线或lodash _.each

Replacing underscore or lodash _.each with vanilla for loop

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

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

理想情况下,我希望使用普通的javascript进行循环,但我不理解下划线/lodash中的_.each()函数如何替换它…

类似:

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

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

dataDefault看起来像:

1
2
3
4
var dataDefault = {
    title: null,
    description: null
};

调用函数的一个例子是:

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


试试这个:

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

对于中的for..In,必须使用HasOwnProperty排除继承属性。


所以,如果我正确地解释了您的逻辑,那么您要做的就是循环访问默认对象中的键,如果您要检查的对象没有该键,那么您需要将该键添加到对象中,并将其值赋给默认值,对吗?浏览器级别有限制吗?

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

1
2
3
4
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),那么您需要在确定键的存在和值的类型方面做更多的工作。但根据你的例子,你并不担心。