我有一个像以下的对象:
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
});
}
答案 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;
}, {});