尝试更改一个对象以准备发送,方法是将数组放入其中并将其转换为一个对象,其中数组中的项为值为true的键。
它开始看起来像 -
{"state":["Saved","Published"],"discipline":["Marketing"]}
所以最终结果看起来像是
{"state":{"Saved":true,"Published":true},"discipline":{"Marketing":true}}
所以它只是查看该数组并将其更改为值为true的对象。我正在尝试使用下划线,但普通的js可以正常工作。
这是我的尝试,有没有更好的方法来做到这一点,也许用下划线? -
function transformOutputToFilterModel(model) {
var transformedObj = _.map(model, function(obj) {
return obj.reduce(function(obj, k) {
obj[k] = true;
return obj;
}, {})
});
return transformedObj;
}
感谢阅读!
编辑 - 对不起我已经标记了一个答案,并没有意识到它并没有完全正确。我有这个功能 -
var transformedObj = _.map(model, function(obj) {
return obj.reduce(function(obj, k) {
obj[k] = true;
return obj;
}, {});
});
这确实正确地格式化了内部对象,但它正在拉出外键 - 请参阅此处:https://jsfiddle.net/d0kjctfh/3/
那些外在的目标应该具有像这样的国家和纪律的关键 -
{"state":{"Saved":true,"Committed":false,"Published":false},"discipline":{"Marketing":true}};
谢谢!
答案 0 :(得分:4)
您需要分几步完成:
_.mapObject(model, function(vals) {
return _.object(vals, _.map(vals, function() { return true; }));
} );
地图只列出true
的正确长度,_.object将["Saved","Published"]
更改为{"Saved":true,"Published":true}
,_. mapObject将其应用于每个字段。
答案 1 :(得分:1)
无需下划线; Array.map()是本机Javascript。但是,map返回一个数组,这不是你想要的。尝试reduce,将结果累积到(最初)空对象中:
var input = {"state":["Saved","Published"],"discipline":["Marketing"]};
var toObject = function(arr) {
return arr.reduce(function(prev,curr){
prev[curr]=true;
return prev;
},{});
}
console.log(toObject(input.state));
答案 2 :(得分:1)
我认为_.map将始终返回一个数组,因此它不是最佳解决方案。试试下面的代码。
var t = {"state":["Saved","Published"],"discipline":["Marketing"]},
newObj = {};
_.each(t, function(obj, index) {
newObj[index] = {};
if(_.isArray(obj)){
var toReturn = {};
_.each(obj, function(index,item){
toReturn[index] = true;
});
newObj[index] = toReturn;
}
});
console.log(newObj);
答案 3 :(得分:1)
有时最简单的方法是经典方式:
function prepareObject(obj){
var i, e, o = {};
for(e in obj){
if(obj.hasOwnProperty(e)){
o[e] = {};
for(i = 0; i <= obj[e].length - 1; i++) {
obj[e][obj[e][i]] = true;
}
}
}
return o;
}
优化/缩小
window.prepareObject = function(b){var c,a,d = {}; for(a in b)if(b.hasOwnProperty(a))for(d [a] = {},c = 0 ; c&lt; = b [a] .length-1; c ++)b [a] [b [a] [c]] =!0; return d};
答案 4 :(得分:1)
var input = {"state":["Saved","Published"],"discipline":["Marketing"]};
function childToObj(arr) {
return arr.reduce(function(prev,curr){
prev[curr]=true;
return prev;
},{});
}
for (var key in input) {
if (input.hasOwnProperty(key)) {
input[key] = childToObj(input[key]);
}
}
console.log(input);
console.log(JSON.stringify(input));