对于像[ true , 1, 'car', { a: '1' }]
这样的数组,我如何使用reduce来评估整个数组是真还是假?它必须考虑真实值和虚假值。
此外,如果所有值均为真,则使用reduce返回true。如果元素与true和false混合,则返回false。如果所有元素都是false,则返回false。
我也不能全部使用。我实际上正在尝试通过将reduce用作赋值来实现每种方法。它的工作原理是不会通过所有真正的结果,也不会将结果转换为bool 奖金问题:)(如果我有
)_.every([1], _.identity)).to.be.true;
_.every([0], _.identity)).to.be.false;
{}也是真实的吗? 奖金奖励问题
这是我的代码,但未使用reduce,这可能会使评估真值,假值和混合值更加困难。感谢您的帮助!
_.every = function(collection, iterator) {
// TIP: Try re-using reduce() here.
var results = [];
if ( iterator === undefined ) {
_.each( collection , function( item ) {
results.push( item );
});
} else {
if ( Array.isArray( collection ) === true ) {
var copiedArr = collection.slice();
// iterate through each item using each
_.each( collection , function( item ) {
// input our own iterator calling truth test
if ( iterator( item ) === true ) {
// store results in array
results.push( true )
} else {
results.push( false );
}
} );
} else if ( typeof collection === 'object' ) {
var copiedObj = JSON.parse(JSON.stringify( collection ));
// iterate through each item using each
_.each( copiedObj , function( item ) {
// input our own iterator calling truth test
if ( iterator( item ) === true ) {
// store results in array
results.push( true )
} else {
results.push( false );
}
});
}
} // end of iterator defined else
// if array contains false return false
if ( _.contains( results , false) ) {
return false
} else {
// else return true
return true;
}
} // end of _.every
```
答案 0 :(得分:2)
听起来您想检查嵌套在结构中任何位置的所有值是否为真。您可以使用递归函数检查每个值是否为真,用Boolean
强制为布尔值,或者如果值是对象,则使用.reduce
并遍历其.values
(同时适用于对象和数组)。 reduce回调可以是
(a, b) => a && Boolean(checkTruthy(b))
如果它为假,它将返回先前的值累加器,否则它将返回被迭代的当前项的真实性。
const checkTruthy = param =>
typeof param !== 'object'
? Boolean(param)
: Object.values(param)
.reduce(
(a, b) => a && Boolean(checkTruthy(b)),
true
);
console.log(checkTruthy([ true , 1, 'car', { a: '1' }]));
console.log(checkTruthy([ true , 1, 'car', { a: '1', b: 0 }]));
console.log(checkTruthy([ true , 1, 'car', { a: 0, b: '1' }]));
或者,为使效率更高但可能不太易读(YMMV),可以将Boolean
移到.reduce
之外:
const checkTruthy = param => Boolean(
typeof param !== 'object'
? param
: Object.values(param)
.reduce(
(a, b) => a && checkTruthy(b),
true
)
);
console.log(checkTruthy([ true , 1, 'car', { a: '1' }]));
console.log(checkTruthy([ true , 1, 'car', { a: '1', b: 0 }]));
console.log(checkTruthy([ true , 1, 'car', { a: 0, b: '1' }]));
或者,如果您不需要递归,则要简单得多:
const checkTruthy = obj => Boolean(
Object.values(obj)
.reduce((a, b) => a && b)
);
console.log(checkTruthy([ true , 1, 'car', { a: '1' }]));
console.log(checkTruthy([ true , 1, 'car', true, { a: '1' }]));
console.log(checkTruthy([ true , 1, 'car', false, { a: '1' }]));
答案 1 :(得分:1)
要实现vendorId
,您将需要使用every
和reduce
作为初始值,并将&&
操作用作约数。对每个值调用谓词函数,如果您不信任它,则将其结果转换为布尔值:
true
如果您还需要function every(arr, predicate) {
return arr.reduce((acc, val) => acc && Boolean(predicate(val)), true);
}
来处理“对象集合”,而不仅仅是数组,那么您可能已经编写了自己的every
版本,可以在任意集合上使用>
reduce