在Lodash,有没有办法做类似的事情:
foo = firstTruthy(foo, bar, 10);
这样第一个" truthy"值已分配给foo
? " truthy"引用是因为某些值(例如0
或""
)会被认为是真实的。
背景信息:在JavaScript中,如果我们这样做
foo = foo || 10;
因此,如果foo
未定义,则会将其设置为0
,但会有一个问题:如果foo
为0
,则会将其视为foo
falsy因此foo = firstTruthy(foo, 10); // this
foo = firstTruthy(foo, bar, 10); // or this
被分配10.在Lodash或通用JavaScript中,有没有办法做类似的事情
foo
以便将第一个真值分配给false
,其中truthy被认为是:所有内容都不是null
,undefined
或0
? (所以即使""
或{{1}}被认为是真实的,类似于Ruby)。
答案 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
是某事。这很容易调整。