【问题标题】:Is there a way to specify default values for null in Lodash or Underscore?有没有办法在 Lodash 或 Underscore 中为 null 指定默认值?
【发布时间】:2017-04-01 13:14:08
【问题描述】:

我知道_.defaults 函数可以为具有undefined 键的对象设置默认值。但是它不适用于null 的键。有没有办法做到这一点?

【问题讨论】:

    标签: javascript underscore.js lodash


    【解决方案1】:

    感谢@Jacque 对null 值的解释。然而,由于不幸的继承代码,我正在处理的对象返回null 值,即使它是为undefined 设计的。这是我通过省略null 属性以更具声明性的方式实现这一点的方法,这将导致undefined,因此将为其值创建默认值。

    const alphabet = {
      a: 'A is for apple',
      // b: undefined,
      c: 'C is for cake',
      d: null,
    }
    const nonNulls = _.omitBy(alphabet, _.isNull) // Omitting null values.
    const longer = _.defaults(nonNulls, {
      b: 'B is for boy',
    })
    
    console.info('Longer Way', longer)
    
    // Or even shorter
    const shorter = _.defaults(_.omitBy(alphabet, _.isNull), {
      b: 'B is for boy',
    })
    
    console.info('Shorter Way', shorter)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

    【讨论】:

    • 哦,这消除了所有 null/NaN/undefined 值并将默认值添加到对象中。我什至没有考虑过那个用例:)
    【解决方案2】:

    _.defaults 助手的这种行为背后的原因是,undefined 表示尚未设置属性,null 传达了明确设置为不引用任何内容的含义。

    如果你仍然认为你的变量应该保持null 并用一个函数设置,那么你可以使用_.defaultTo,这个函数通常返回它的第一个参数,如果第一个参数是NaN,则返回第二个参数,@ 987654327@ 或undefined。不过,您需要自己循环遍历对象的所有键。

    _.forOwn(myObject, function (value, key) {
      myObject[key] = _.defaultTo(value, defaultValues[key]);
    });
    

    但是,这不会为甚至没有在原始元素上定义的变量设置值,因为我们正在循环遍历它自己的属性。此外,它的效率不是很高。如果这是您想要的,不妨循环使用默认值:

    _.forOwn(defaultValues, function (value, key) {
      if (myObject[key] === undefined || myObject[key] === null)
        myObject[key] = value;
    });
    

    function getSampleObject() {
      return {
        a: null,
        b: NaN,
        // c: undefined,
        d: undefined,
        e: 'original'
    }};
    
    var defaultValues = {
      a: 1,
      b: 2,
      c: 3,
      d: 4,
      e: 5
    };
    
    var myObject = getSampleObject();
    _.forOwn(myObject, function (value, key) {
      myObject[key] = _.defaultTo(value, defaultValues[key]);
    });
    
    console.log('defaultTo', myObject);
    
    var myObject = getSampleObject();
    _.defaults(myObject, defaultValues);
    
    console.log('defaults', myObject);
    
    var myObject = getSampleObject();
    _.forOwn(defaultValues, function (value, key) {
      if (myObject[key] === undefined || myObject[key] === null)
        myObject[key] = value;
    });
    
    console.log('handmade', myObject);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

    【讨论】:

      猜你喜欢
      • 2011-10-17
      • 2017-12-05
      • 2011-01-31
      • 1970-01-01
      • 2020-07-15
      • 2013-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多