Javascript, 转换带下划线的对象(或不带下划线)
Javascript, Transforming object with underscore (or not)
我正在准备要发送的对象。最初看起来是这样的:
var myObj = {"state":{"Saved":true,"Committed":false,"Published":false},"discipline":{"Marketing":true}};
并且需要通过查看内部对象并将其转换为值为真的对象的键数组来进行更改。所以在这个例子中它会变成这样:
{"state":["Saved"],"discipline":["Marketing"]};
(committed 和 published 被删除,因为它们被设置为 false。)
这是我目前尝试过的方法:
function mutate() {
//map obj
return _.map(myObj, function(object){
//pluck keys that have = true
return _.keys(_.pick(object[0], Boolean));
});
}
对此有点挣扎,以及如何正确地遍历和构建它。我正在使用下划线 - 但如果它更有意义,那么普通的 javascript 就可以了。谢谢!
您可以使用 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>
作品作者:
- 获取外部对象的键并将每个键简化为该键上
true
个值的集合。
- 在reduce中,我们:
- 仅过滤真值
- Return 每个值只有键
该算法相当简单,几乎可以处理您扔给它的任何物体。您可以轻松更改过滤器,并且您可以尝试一些优化。
带下划线的等价物是:
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>
您的答案就快完成了。使用 _.mapObject 来保留键而不是映射。
var result = _.mapObject(myObj, function(value){
return _.keys(_.pick(value, Boolean));
});
我正在准备要发送的对象。最初看起来是这样的:
var myObj = {"state":{"Saved":true,"Committed":false,"Published":false},"discipline":{"Marketing":true}};
并且需要通过查看内部对象并将其转换为值为真的对象的键数组来进行更改。所以在这个例子中它会变成这样:
{"state":["Saved"],"discipline":["Marketing"]};
(committed 和 published 被删除,因为它们被设置为 false。)
这是我目前尝试过的方法:
function mutate() {
//map obj
return _.map(myObj, function(object){
//pluck keys that have = true
return _.keys(_.pick(object[0], Boolean));
});
}
对此有点挣扎,以及如何正确地遍历和构建它。我正在使用下划线 - 但如果它更有意义,那么普通的 javascript 就可以了。谢谢!
您可以使用 map
、reduce
和 Object.keys
:
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
个值的集合。 - 在reduce中,我们:
- 仅过滤真值
- Return 每个值只有键
该算法相当简单,几乎可以处理您扔给它的任何物体。您可以轻松更改过滤器,并且您可以尝试一些优化。
带下划线的等价物是:
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>
您的答案就快完成了。使用 _.mapObject 来保留键而不是映射。
var result = _.mapObject(myObj, function(value){
return _.keys(_.pick(value, Boolean));
});