2015-04-15 3 views
0

Попытка изменить объект, чтобы подготовить его для отправки, взяв массив внутрь и превратив его в объект с элементами в массиве, являющимися ключами со значениями true.Javascript (Underscore), функция изменения объекта javascript

Он начинает выглядеть как -

{"state":["Saved","Published"],"discipline":["Marketing"]} 

Таким образом, конечный результат будет выглядеть

{"state":{"Saved":true,"Published":true},"discipline":{"Marketing":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/

Того внешний objecst должен иметь ключи от состояния и дисциплин, как это -

{"state":{"Saved":true,"Committed":false,"Published":false},"discipline":{"Marketing":true}}; 

Спасибо!

ответ

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

закончил с этим, спасибо! – ajmajmajma

1

Нет необходимости в подчеркивании; Array.map() - это собственный Javascript. Однако карта возвращает массив, который вам не нужен. Попробуйте уменьшить, накапливая результаты в (первоначально) пустой объект:

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

Вы получили там самостоятельно, пока я печатал! –

+0

Это не добавляет внешнее состояние и дисциплину на – ajmajmajma

+0

. Правильно. Я оставил внешний цикл, чтобы просто показать интересный бит. –

4

Вы должны сделать это в несколько этапов:

_.mapObject(model, function(vals) { 
    return _.object(vals, _.map(vals, function() { return true; })); 
}); 

Карта просто делает список true с нужной длины, _.объект изменяет ["Saved","Published"] на {"Saved":true,"Published":true}, а _.mapObject применяет его к каждому полю.

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

Оптимизированный/Minify

window.prepareObject = функция (б) {уаг С, А, D = {}; для (a в b), если (b.hasOwnProperty (a)) для (d [a] = {}, c = 0; c < = b [a] .length-1; C++) b [a] [b [a ] [c]] =! 0; return d};

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

Смежные вопросы