Javascript(下划线),用于更改javascript对象的函数

时间:2015-04-15 01:22:01

标签: javascript underscore.js

尝试更改一个对象以准备发送,方法是将数组放入其中并将其转换为一个对象,其中数组中的项为值为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}};

谢谢!

5 个答案:

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