Javascript 从对象获取布尔值

Javascript 从对象获取布尔值,javascript,Javascript,我有一个像这样的物体: var packages = { SoftwareColumn: false, BatchNumberColumn : false, MatrixId : 1, CommentsColumn : true, PartNumber : "Abc123" } 上面的物体要大得多,但对于这个问题,我已经缩小了范围。如果在它上面循环并获取所有键/值,其中值为true,我将尝试实现什么。我试过了 if (packages.length > 0) { Object.

我有一个像这样的物体:

var packages = { SoftwareColumn: false, BatchNumberColumn : false, MatrixId : 1, CommentsColumn : true, PartNumber : "Abc123" }
上面的物体要大得多,但对于这个问题,我已经缩小了范围。如果在它上面循环并获取所有键/值,其中值为
true
,我将尝试实现什么。我试过了

if (packages.length > 0) {
     Object.keys(packages).forEach(function (key) {
        //here I can't figure out how to get values which are only true and get their key
  });
}
您可以使用
reduce()
代替
forEach()
循环并返回obj。要仅返回
true
值,可以使用identity/strict equality
==
运算符

var包={
软件专栏:错,
BatchNumberColumn:false,
MatrixId:1,
评论专栏:没错,
零件号:“Abc123”
}
var newObj=Object.keys(包).reduce(函数(r,e){
if(packages[e]==true)r[e]=packages[e]
返回r;
}, {})
console.log(newObj)
您可以使用
reduce()
而不是
forEach()
循环并返回obj。要仅返回
true
值,可以使用identity/strict equality
==
运算符

var包={
软件专栏:错,
BatchNumberColumn:false,
MatrixId:1,
评论专栏:没错,
零件号:“Abc123”
}
var newObj=Object.keys(包).reduce(函数(r,e){
if(packages[e]==true)r[e]=packages[e]
返回r;
}, {})

console.log(newObj)
对象没有长度属性。这意味着您将始终在if中未定义

使用将使检查密钥变得容易:

var-packages={SoftwareColumn:false,BatchNumberColumn:false,MatrixId:1,CommentsColumn:true,PartNumber:“Abc123”}
var键=[];
用于(输入包){
如果(包[键]==真){
按键。按(键);
}
}

控制台日志(键)对象没有长度属性。这意味着您将始终在if中未定义

使用将使检查密钥变得容易:

var-packages={SoftwareColumn:false,BatchNumberColumn:false,MatrixId:1,CommentsColumn:true,PartNumber:“Abc123”}
var键=[];
用于(输入包){
如果(包[键]==真){
按键。按(键);
}
}
控制台日志(键)尝试使用和。尝试使用
==
也与类型匹配。添加了注释的说明

var-packages={SoftwareColumn:false,BatchNumberColumn:false,MatrixId:1,CommentsColumn:true,PartNumber:“Abc123”}
var res=Object.keys(packages).filter(函数(a){//筛选真值键
返回包[a]==true//其验证的类型也是布尔值和true
}).reduce(函数(a,b){//reduce用于重新创建筛选器对象
a[b]=包[b]
归还
}, {})
console.log(res)
尝试使用和。尝试使用
=
也与类型匹配。添加了注释的解释

var-packages={SoftwareColumn:false,BatchNumberColumn:false,MatrixId:1,CommentsColumn:true,PartNumber:“Abc123”}
var res=Object.keys(packages).filter(函数(a){//筛选真值键
返回包[a]==true//其验证的类型也是布尔值和true
}).reduce(函数(a,b){//reduce用于重新创建筛选器对象
a[b]=包[b]
归还
}, {})
console.log(res)
您可以筛选并用于新对象

var packages={SoftwareColumn:false,BatchNumberColumn:false,MatrixId:1,CommentsColumn:true,PartNumber:“Abc123”},
trueItems=对象。分配(…对象
.钥匙(套装)
.filter(k=>packages[k]==true)
.map(k=>({[k]:包[k]}))
);
console.log(trueItems)您可以筛选并用于新对象

var packages={SoftwareColumn:false,BatchNumberColumn:false,MatrixId:1,CommentsColumn:true,PartNumber:“Abc123”},
trueItems=对象。分配(…对象
.钥匙(套装)
.filter(k=>packages[k]==true)
.map(k=>({[k]:包[k]}))
);

console.log(trueItems)我假设,您只希望检索类型为“Boolean”的项,而不是JavaScript规则中的“truthy”。为了验证给定对象的字段是否为布尔值,我建议在对象的字段上使用'typeof'运算符或调用object.prototype.toString.call(我自己更喜欢使用第二个选项,因为它具有更好的灵活性,尽管会牺牲性能)


我假设,您只希望检索类型为“Boolean”的项,而不是JavaScript规则中的“truthy”。为了验证给定对象的字段是否为布尔值,我建议在对象的字段上使用'typeof'运算符或调用object.prototype.toString.call(我自己更喜欢使用第二个选项,因为它具有更好的灵活性,尽管会牺牲性能)



如果只需要每个键的值->
返回包[key]您是否还需要“真实”的键,例如布尔(“Abc1234”)=真值还是只需要实际为真的值?@SteffenSchmitz只需要实际为真的值哦。您可以先过滤它们
Object.keys(packages).filter(k=>packages[k]==true).forEach(k=>console.log(packages[k])
?对象文本没有if语句中测试的length属性:
packages.length>0
如果您只需要每个键的值->
返回packages[key]您是否还需要“真实”的键,例如布尔(“Abc1234”)=真值还是只需要实际为真的值?@SteffenSchmitz只需要实际为真的值哦。您可以先过滤它们
Object.keys(packages).filter(k=>packages[k]==true).forEach(k=>console.log(packages[k])
?对象文本没有if语句中测试的length属性:
packages.length>0
(请记住过滤继承的属性和方法)(请记住筛选继承的属性和方法)谢谢!我如何更改此项以仅获取值为true的键您将在reduce中使用数组作为累加器,如果值为
true
则将该键推送到该数组谢谢!在这种情况下,这是perfectOr
var packages = { SoftwareColumn: false, BatchNumberColumn : false, MatrixId : 1, CommentsColumn : true, PartNumber : "Abc123" }
console.log(packages);
if (Object.keys(packages).length > 0) {
     Object.keys(packages).forEach(function (key) {
            if(packages[key]==true){
          console.log(key);
          }
  });
}
let packages = { SoftwareColumn: false, BatchNumberColumn : false, MatrixId : 1, CommentsColumn : true, PartNumber : "Abc123" }
let filtered = Object.keys(packages).reduce((acc, key) => {
  if(Object.prototype.toString.call(packages[key]) === '[object Boolean]' && packages[key]) {
    acc[key] = packages[key];
  }
  return acc;
}, {});