Javascript JS-获取筛选值的对象键值对,不带下划线

Javascript JS-获取筛选值的对象键值对,不带下划线,javascript,Javascript,我在用真/假过滤对象的值方面有一个问题,就像在本主题中一样,但没有下划线,这意味着只使用纯JS。关于StackOverflow,有许多或多或少类似的问题,但不幸的是,我没有制定一个有效的方法 例如,我有一个对象: var anObject = {first_property: false, second_property: true, third_property: false, fourth_property: false, fifth_property: false, sixth_prope

我在用真/假过滤对象的值方面有一个问题,就像在本主题中一样,但没有下划线,这意味着只使用纯JS。关于StackOverflow,有许多或多或少类似的问题,但不幸的是,我没有制定一个有效的方法

例如,我有一个对象:

var anObject = {first_property: false, second_property: true, third_property: false, fourth_property: false, fifth_property: false, sixth_property: true, seventh_property: false, eight_property: nine-nth_property: false}
我需要得到一个新的对象,具有专门的真实值,比如:

var newObject = { second_property: true, sixth_property: true }
为了过滤,我编写了以下过滤器:

function isValid(value) {
    if (typeof value === "undefined" || value == null || value.length == 0 || value == false) {
        return false;
    } else {
        return true;
    }
}

打破了我的头脑,花了几个小时尝试不同的方法,但结果并不令人满意。我应该如何构建算法来实现这一点,哪些自定义/开箱即用函数值得在这里使用?提前谢谢

您需要在键/值对上循环,找出哪些是
true
。解决方案的工作原理如下:

  • 使用从对象获取键/值对
  • 使用对条目进行迭代
  • 在每次迭代中,检查值是否为
    true
    。如果是,则将键/值对添加到结果中
  • var obj={
    第一个属性:false,
    第二个属性:true,
    第三个属性:false,
    第四个属性:false,
    第五个属性:false,
    第六个属性:正确,
    第七组属性:false
    };
    var res=Object.entries(obj)
    .reduce((结果,[键,值])=>{
    如果(值){
    结果[键]=值;
    }
    返回结果;
    }, {})
    
    控制台日志(res)有几种方法可以使用
    Object.entries()
    Object.keys()
    、不同的数组方法等来实现这一点,但我想我会提供一种。将键向下筛选到值为
    true
    ,然后将这些键添加到
    输出中

    var obj={
    第一个属性:false,
    第二个属性:true,
    第三个属性:false,
    第四个属性:false,
    第五个属性:false,
    第六个属性:正确,
    第七组属性:false
    };
    var输出={};
    key(obj)//从对象['first_属性','second_属性',…]获取所有键
    .filter((key)=>obj[key])//将键列表向下筛选,仅筛选出其值为true的键
    .forEach((键)=>output[key]=obj[key])//对于筛选列表中的每个键,将其添加到输出对象中
    
    控制台日志(输出)
    也可以通过减少
    Object.keys
    数组(无需额外过滤):

    还有一个略短的版本:

    Object.keys(obj).reduce((acc, key) => (obj[key] && (acc[key] = obj[key]), acc), {});
    
    您可以过滤()truthy键,并使用以下内容创建新对象():

    var obj={第一个属性:false,第二个属性:true,第三个属性:false,第四个属性:false,第五个属性:false,第六个属性:true,第七个属性:false};
    var result=Object.keys(obj).filter(k=>obj[k]).reduce((a,k)=>(a[k]=obj[k],a),{});
    
    控制台日志(结果)请不要重新分配
    对象
    ,至少命名变量
    对象
    ;-)@卢卡:好的,改名为:)谢谢你!对于我来说,今天晚上会有新的东西出现,我将花在你的和31 PIY的解决方案上,以掌握这个概念。很高兴能提供帮助。像31piy这样使用单个
    reduce
    的解决方案的性能将优于我的解决方案,因为我的解决方案需要两次迭代。也就是说,我已经在我的代码中添加了一些注释,这样您就可以更清楚地了解一些代码在做什么。非常感谢!在我掌握了概念并成功实施了解决方案之后,明天我将回到这个问题上。这个问题对我非常有用,昨天晚上我学到了很多新东西,谢谢。最后,我成功地实现了31piy提出的解决方案,正如您所说,它看起来是最精简的方法。不过,多亏了你们,你们补充了我的知识
    Object.keys(obj).reduce((acc, key) => (obj[key] && (acc[key] = obj[key]), acc), {});