从对象获取bool值

时间:2017-05-25 11:05:47

标签: javascript

我有一个像以下的对象:

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
  });
}

6 个答案:

答案 0 :(得分:3)

您可以使用reduce()代替forEach()循环并返回obj。要返回true值,您可以使用identity / strict equality ===运算符。



var packages = {
  SoftwareColumn: false,
  BatchNumberColumn: false,
  MatrixId: 1,
  CommentsColumn: true,
  PartNumber: 'Abc123'
}

var newObj = Object.keys(packages).reduce(function(r, e) {
  if(packages[e] === true) r[e] = packages[e]
  return r;
}, {})

console.log(newObj)




答案 1 :(得分:0)

对象没有长度属性。这意味着您将始终在if。

中获得未定义

使用for in可以轻松检查按键:



var packages = { SoftwareColumn: false, BatchNumberColumn : false, MatrixId : 1, CommentsColumn : true, PartNumber : "Abc123" }
var keys = [];

for (key in packages) {
  if (packages[key] === true) {
    keys.push(key);
  }
}


console.log(keys);




答案 2 :(得分:0)

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);
          }
  });
}

答案 3 :(得分:0)

尝试使用Array#filter()Array#reduce。尝试===与类型相匹配.explanation添加评论

var packages = { SoftwareColumn: false, BatchNumberColumn: false, MatrixId: 1, CommentsColumn: true, PartNumber: "Abc123" }

var res = Object.keys(packages).filter(function(a) { // filter the true value keys
  return packages[a] === true //its validate the type of also boolean and true
}).reduce(function(a, b) { //reduce used for recreate the filter object
  a[b] = packages[b] 
  return a
}, {})

console.log(res)

使用Arrow function

更简化格式
console.log(Object.keys(packages).filter(a=> (packages[a])).reduce((a,b)=> (a[b] = packages[b] ,a),{}))

答案 4 :(得分:0)

您可以过滤并使用Object.assign作为新的目标



var packages = { SoftwareColumn: false, BatchNumberColumn: false, MatrixId: 1, CommentsColumn: true, PartNumber: "Abc123" },
    trueItems = Object.assign(...Object
        .keys(packages)
        .filter(k => packages[k] === true)
        .map(k => ({ [k]: packages[k] }))
    );
    
console.log(trueItems);




答案 5 :(得分:0)

我认为,您只想检索类型为'布尔'而不是" truthy"就JavaScript规则而言。为了验证给定对象的字段是否为布尔值,我建议使用' typeof'运算符或在对象的字段上调用Object.prototype.toString.call(我自己,我更喜欢使用第二个选项,因为它具有更好的灵活性,尽管性能和成本)

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;
}, {});