如何使用reduce评估数组或对象集合的真实,混合和虚假值

时间:2019-01-25 01:23:48

标签: javascript

对于像[ 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
    ```


2 个答案:

答案 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,您将需要使用everyreduce作为初始值,并将&&操作用作约数。对每个值调用谓词函数,如果您不信任它,则将其结果转换为布尔值:

true

如果您还需要function every(arr, predicate) { return arr.reduce((acc, val) => acc && Boolean(predicate(val)), true); } 来处理“对象集合”,而不仅仅是数组,那么您可能已经编写了自己的every版本,可以在任意集合上使用

reduce