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));