2015-02-01 4 views
0

Я пытаюсь создать более функциональный стиль и хотел бы установить все свойства объекта (и, если возможно, под-объекты), на конкретный значение, например false на месте. Есть ли ярлык или мне нужно перебирать свойства?Ярлык в подстроке/Lodash для (рекурсивно) задает все свойства объекта

var obj = { 
    a: true, 
    b: true, 
    c: true, 
    ... 
    z: true 
} 

Трансформация в:

var obj = { 
    a: false, 
    b: false, 
    c: false, 
    ... 
    z: false 
} 

ответ

0

я написал что-то подобное для выполнения регулярного выражения заменить на полях, вложенных в моем объекте, который согласованный с заданным шаблоном. Затем я включил его в объект подчеркивания/лодаша, чтобы использовать его так, как вы этого хотите.

Modified для ваших целей это может выглядеть примерно так:

function(obj) { 
    var $this = this, 
     checkField = function(field) { 
      if (typeof field === "undefined" || field === null || typeof field === "boolean") { 
       return false; 
      } else { 
       return field; 
      } 
     }, 
     checkObject = function(obj) { 
      if (obj instanceof Object) { 
       Object.getOwnPropertyNames(obj).forEach(function (val) { 
        if (obj[val] instanceof Array) { 
         obj[val] = checkArray(obj[val]); 
        } else if (obj[val] instanceof Object) { 
         obj[val] = checkObject(obj[val]); 
        } else { 
         obj[val] = checkField(obj[val]); 
        } 
       }); 
       return obj; 
      } else if (obj instanceof Array) { 
       return checkArray(obj); 
      } else { 
       return checkField(obj); 
      } 
     }, 
     checkArray = function(arr) { 
      if (arr instanceof Array) { 
       arr.forEach(function(val) { 
        if (val instanceof Object) { 
         obj[val] = checkObject(val); 
        } else { 
         obj[val] = checkField(val); 
        } 
       }); 
       return arr; 
      } else { 
       return arr; 
      } 
     }; 
    obj = checkObject(obj); 
} 

Чтобы добавить его в качестве Mixin:

window._.mixin({ 
    setBoolsAndSuchToFalse: function(obj) { 
     . . . . // The contents of the function from above 
    } 
}); 
0

Вы можете использовать подчеркивание для более функционального стиля.

Вы можете перебирать свой объект, если отсутствует, вы можете изменить его или повторить его, а также изменить все недостающие свойства суб-объектов.

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; 
    }, {}); 
} 
+0

Я думаю, что я еще недостаточно смотрел под капотом в библиотеке подчёркивания. Мне было любопытно, почему использовать _.keys(). В моем тестировании он возвращал все члены объекта (включая такие вещи, как «длина»), тогда как мне нужны только мои собственные имена свойств. По этой причине было бы лучше использовать getOwnPropertyNames()? –

+0

вы хотите перебрать хэш, а не на массив [проверить это] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames) – eenagy

+0

Либо я не понимая, что вы имеете в виду, или вы меня не понимаете. Если вы выполняете _.keys() для объекта, вы получите члены, которых вы не можете пожелать, например методы в цепочке прототипов .length и т. Д. Использование getOwnPropertyNames() вместо _.keys() позволяет избежать этой проблемы , или если вы повторяли результаты _.keys(), вы также можете сделать _.has(), чтобы отфильтровать нежелательные элементы. –

Смежные вопросы