Вы можете использовать подчеркивание для более функционального стиля.
Вы можете перебирать свой объект, если отсутствует, вы можете изменить его или повторить его, а также изменить все недостающие свойства суб-объектов.
function remap(object, missingValue, suppliedValue){
var keys= _.keys(object);
return _.reduce(keys, function(memo, key){
memo[key] = object[key];
if(memo[key] === missingValue){
memo[key] = suppliedValue;
}
if(_.isObject(memo[key])){
memo[key] = remap(memo[key],missingValue,suppliedValue);
}
return memo;
}, {});
}
var h = {val : 3, b : undefined, d : undefined , k : {
a: false, b: undefined
}, c: function(){ console.log(a);}};
console.log(remap(h,undefined,false));
Если вам нужна более сложная проверка для сравнения значений, используйте следующую функцию.
function remap(object, complexCheck){
var keys= _.keys(object);
return _.reduce(keys, function(memo, key){
memo[key] = object[key];
memo[key] = complexCheck(memo[key]);
if(_.isObject(memo[key])){
memo[key] = remap(memo[key],complexCheck);
}
return memo;
}, {});
}
Я думаю, что я еще недостаточно смотрел под капотом в библиотеке подчёркивания. Мне было любопытно, почему использовать _.keys(). В моем тестировании он возвращал все члены объекта (включая такие вещи, как «длина»), тогда как мне нужны только мои собственные имена свойств. По этой причине было бы лучше использовать getOwnPropertyNames()? –
вы хотите перебрать хэш, а не на массив [проверить это] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames) – eenagy
Либо я не понимая, что вы имеете в виду, или вы меня не понимаете. Если вы выполняете _.keys() для объекта, вы получите члены, которых вы не можете пожелать, например методы в цепочке прототипов .length и т. Д. Использование getOwnPropertyNames() вместо _.keys() позволяет избежать этой проблемы , или если вы повторяли результаты _.keys(), вы также можете сделать _.has(), чтобы отфильтровать нежелательные элементы. –