Javascript(下划线),改变javascript对象的函数
Javascript (Underscore), function to change javascript object
尝试更改一个对象以准备发送,方法是将数组放入内部并将其转换为一个对象,其中数组中的项目是值为 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}};
谢谢!
不需要下划线; Array.map() 是原生的 Javascript。但是,映射 returns 一个数组,这不是您想要的。尝试减少,将结果累积到一个(最初)空对象中:
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));
您需要分几步完成:
_.mapObject(model, function(vals) {
return _.object(vals, _.map(vals, function() { return true; }));
} );
地图只是列出了 true
的正确长度,_.object 将 ["Saved","Published"]
更改为 {"Saved":true,"Published":true}
并且 _.mapObject 将其应用于每个字段。
我认为 _.map 总是 return 一个数组,所以它不是最好的解决方案。试试下面的代码。
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);
有时最简单的方法就是经典方法:
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=函数(b){var c,a,d={};for(a in b)if(b.hasOwnProperty(a))for(d[a]= {},c=0;c<=b[a].length-1;c++)b[a][b[a][c]]=!0;return d};
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));
尝试更改一个对象以准备发送,方法是将数组放入内部并将其转换为一个对象,其中数组中的项目是值为 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}};
谢谢!
不需要下划线; Array.map() 是原生的 Javascript。但是,映射 returns 一个数组,这不是您想要的。尝试减少,将结果累积到一个(最初)空对象中:
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));
您需要分几步完成:
_.mapObject(model, function(vals) {
return _.object(vals, _.map(vals, function() { return true; }));
} );
地图只是列出了 true
的正确长度,_.object 将 ["Saved","Published"]
更改为 {"Saved":true,"Published":true}
并且 _.mapObject 将其应用于每个字段。
我认为 _.map 总是 return 一个数组,所以它不是最好的解决方案。试试下面的代码。
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);
有时最简单的方法就是经典方法:
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=函数(b){var c,a,d={};for(a in b)if(b.hasOwnProperty(a))for(d[a]= {},c=0;c<=b[a].length-1;c++)b[a][b[a][c]]=!0;return d};
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));