在Lodash(JavaScript)中,是否有一个函数可以返回第一个" truthy"或者"有意义的"值?

时间:2017-09-01 18:50:36

标签: javascript lodash

在Lodash,有没有办法做类似的事情:

foo = firstTruthy(foo, bar, 10);

这样第一个" truthy"值已分配给foo? " truthy"引用是因为某些值(例如0"")会被认为是真实的。

背景信息:在JavaScript中,如果我们这样做

foo = foo || 10;

因此,如果foo未定义,则会将其设置为0,但会有一个问题:如果foo0,则会将其视为foo falsy因此foo = firstTruthy(foo, 10); // this foo = firstTruthy(foo, bar, 10); // or this 被分配10.在Lodash或通用JavaScript中,有没有办法做类似的事情

foo

以便将第一个真值分配给false,其中truthy被认为是:所有内容都不是nullundefined0? (所以即使""或{{1}}被认为是真实的,类似于Ruby)。

4 个答案:

答案 0 :(得分:3)

如果你不想要a = b || c,你就会滥用“truthy”一词。 “Truthy”值已明确定义,您无法在该定义中任意包含其他值,如0""

如果您想编写自己的“指定真值或零值或其他条件组合”,请使用Array#find

var value = [foo, bar, baz].find(x => x || x == 0 || x == "");

答案 1 :(得分:0)

你可以这样做:

function firstTruthy(...args) {
    return args.find(arg => arg !== null && arg !== undefined && arg !== false);
}

答案 2 :(得分:0)

您可以查看真值的值,或使用Array#includes查看。



const firstTruthy = (...array) => array.find(a => a || [0, ''].includes(a));

console.log(firstTruthy(undefined, null, 10)); // 10
console.log(firstTruthy(undefined, 0, 10));    // 0
console.log(firstTruthy(false, '', 10));       // ''




答案 3 :(得分:0)

当不谈论Javascript对“truthy”的非常具体的定义时,不要使用术语“truthy”。 您要求的是我用来称为某事 vs nothing 的东西。 AFAIK Lodash没有这样的功能。这是我的首选解决方案:

/**
 * Return the first provided value that is something, or undefined if no value is something.
 * undefined, null and NaN are not something
 * All truthy values + false, 0 and "" are something
 * @param {*} values Values in order of priority
 * @returns {*} The first value that is something, undefined if no value is something
 */
function getSomething(...values) {
  return values.find(val => val !== null && val !== undefined && !Number.isNaN(val));
}

与您要求的不同之处在于,我的函数认为false某事。这很容易调整。