我希望准备一个发送对象。它最初看起来像这样:
var myObj = {"state":{"Saved":true,"Committed":false,"Published":false},"discipline":{"Marketing":true}};
需要通过查看内部对象并将其转换为值为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是好的。谢谢!
答案 0 :(得分:2)
您可以使用map
,reduce
和Object.keys
在vanilla JS中解决此问题:
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>
&#13;
这适用于:
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);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<pre id="results"></pre>
&#13;
答案 1 :(得分:1)
你的答案几乎就在那里。使用_.mapObject保留密钥而不是地图。
var result = _.mapObject(myObj, function(value){
return _.keys(_.pick(value, Boolean));
});