我想准备一个可以发送的物品。最初看起来是这样的:
var myObj = {"state":{"Saved":true,"Committed":false,"Published":false},"discipline":{"Marketing":true}};需要通过查看内部对象并将其转换为值为真的对象的键数组来进行更改。因此,在这个例子中,它将转换为:
{"state":["Saved"],"discipline":["Marketing"]};(提交和发布被删除,因为它们被设置为false。)
以下是我迄今尝试过的:
function mutate() {
//map obj
return _.map(myObj, function(object){
//pluck keys that have = true
return _.keys(_.pick(object[0], Boolean));
});
}努力解决这个问题,以及如何正确地遍历和构建它。我使用的是下划线--但是如果简单的javascript更有意义的话,就可以了。谢谢!
发布于 2015-04-13 18:36:20
您可以使用map、reduce和Object.keys在vanilla中解决这一问题。
var myObj = {
"state": {
"Saved": true,
"Committed": false,
"Published": false
},
"discipline": {
"Marketing": true
}
};
var output = Object.keys(myObj).reduce(function(p, collection) {
var values = myObj[collection];
p[collection] = Object.keys(values).filter(function(key) {
return values[key] === true;
});
return p;
}, {});
document.getElementById('results').textContent = JSON.stringify(output);<pre id="results"></pre>
这项工作是通过以下方式进行的:
true值的集合。
该算法相当简单,应该适用于几乎所有抛向它的对象。您可以轻松地更改筛选器,并且可能会有一些优化,您可以尝试。
与下划线对应的内容如下:
var myObj = {
"state": {
"Committed": false,
"Saved": true,
"Published": false
},
"discipline": {
"Marketing": true
}
};
var output = _.reduce(myObj, function(p, values, collection) {
p[collection] = _.chain(values).map(function(value, key) {
console.log('filter', arguments);
if (value === true) {
return key;
}
}).filter(function(it) {
return !!it;
}).value();
return p;
}, {});
document.getElementById('results').textContent = JSON.stringify(output);<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<pre id="results"></pre>
发布于 2015-04-13 19:15:20
你的答案差一点就到了。使用_来保留键而不是映射。
var result = _.mapObject(myObj, function(value){
return _.keys(_.pick(value, Boolean));
});https://stackoverflow.com/questions/29612479
复制相似问题