2015-03-26 3 views
3

У меня есть функция, которая принимает объект и превращает его в (слегка) другой. Я сделал первый шаг, чтобы просто заставить его работать, и теперь я хотел бы упростить эту функцию, я чувствую, что могу немного сократить, но могу использовать некоторую помощь в этом.Javascript, упрощающий преобразование объектов

Так объект получает передается в как так

{"module1":{"calender":["yes","no","maybe"]}} 

и получает выплюнуть, как так

{module1: "calender,yes,no,maybe"} 

Так вот то, что я сейчас:

function(obj) { 

       for (i in obj) { 

        for (p in obj[i]) { 
         var decodeModule = encodeURIComponent(decodeURIComponent(i)); 
         var newObj = {}; 
         var frontOf = encodeURIComponent(p); 
         var backOf = "" 
          //needs work 
         var lastItem = obj[i][p][obj[i][p].length - 1]; 
         for (y in obj[i][p]) { 

          if (obj[i][p][y] == lastItem) { 
           //replace "," in last item 
           backOf += encodeURIComponent(decodeURIComponent(obj[i][p][y])); 
          } else { 
           backOf += encodeURIComponent(decodeURIComponent(obj[i][p][y])) + ","; 
          } 
         }; 
         newObj[decodeModule] = frontOf + "," + backOf; 
        } 
       } 
       return newObj; 
      } 

Так что я уже знаю, что мне не нужно зацикливать второй цикл (для (p в obj [i])), потому что на этом уровне всегда будет только 1 элемент. Кроме этого, я немного зациклен на том, как очистить этот бит - мне предложили, возможно, проверить .reduce или .map использовать меньше кода? Я также использую подчеркивание в своем коде, если это поможет здесь. ЛЮБИТЕ это, если кто-то может помочь мне сделать это немного более элегантным. Спасибо за прочтение!

ответ

2

Хорошо, это было интересное мероприятие. После того, как я это закончил, я подумал: «Почему мы снова это делаем?» :)

Я уменьшаю значение свойства до строки, а затем выполнил замену с использованием регулярных выражений и _.map для замены каждого совпадения. http://codepen.io/anon/pen/VYgodo

Я знаю, что это также можно улучшить. Кто-то разорвет его!

var input = { 
"module1": { 
"calender": ["yes", "no", "maybe"] 
}, 
"module2": { 
"falender": ["yes", "no", "jein"] 
} 
}; 

//output: {module1: "calender,yes,no,maybe"} 

function reduceObj(obj) { 
newObj = {}; 


_.each(obj, function (value, key, list) { 

var r = new RegExp(/(?:^({).*(:\[).*(\]})$)/); 
//reduce property value to string and replace using regex 
newObj[key] = JSON.stringify(list[key]).replace(r, function (match, p1, p2, p3, p4, p5, offset, string) { 
//this may be the only way to replace each capture 
_.map([p1, p2, p3, p4], function (value, index, list) { 
match = match.replace(value, ""); 
}); //end map 

//replace double quote with comma and single quote with nothing 
return match.replace(/\"\"/g, ',').replace(/\"/g, ""); 

}); //end replace 


}); //end each 

return newObj; 
}; 

$(document).ready(function() { 
console.log(reduceObj(input)); 
$('#output').html(JSON.stringify(reduceObj(input))); 

}); 
+0

ой сладкий ребенок jeebus, это потрясающе !!! ! Спасибо!! –

+0

wow, какой гениальный метод :) – Steph

+0

Любой способ захвата encodeURIComponent (decodeURIComponent parts в этом методе? –

1

Как насчет этого? Нет подчеркивания, никакого регулярного выражения, просто старый старый ванильный JavaScript.

var input = { 
 
    1: { 
 
    "calender": ["yes", "no", "maybe"] 
 
    }, 
 
    "module2": { 
 
    "test2": ["|", "#", "&", "?", ",", "+", " ", "\\", "\""] 
 
    }, 
 
    "One More for Good Measure": {} 
 
}; 
 

 
function reduceObj(obj) { 
 
    function helper(o) { 
 
    var key = Object.keys(o)[0]; 
 
    if (typeof key != 'string') return ''; 
 
    return [].concat(key, o[key]).map(e_d).join(','); 
 
    } 
 

 
    function e_d(str) { 
 
    return encodeURIComponent(decodeURIComponent(str)); 
 
    } 
 
    
 
    var newObj = {}, prop; 
 

 
    for (prop in obj) { 
 
    if (obj.hasOwnProperty(prop)) { 
 
     newObj[e_d(prop)] = helper(obj[prop]); 
 
    } 
 
    } 
 
    return newObj; 
 
} 
 

 
var output = reduceObj(input); 
 
document.write('<pre>' + JSON.stringify(output, 0, 2));

Если у вас есть несколько ключей под module2 (к примеру) все, что вам нужно сделать, это изменить helper: DEMO

function helper(o) { 
    var arr = []; 
    Object.keys(o).forEach(function(key) { 
     o[key].unshift(key); 
     arr = arr.concat(o[key]); 
    }); 
    return arr.map(e_d).join(','); 
} 
+0

Это также фантастика! помогите. Могу ли я вставить части кодирования/декодирования здесь? –

+0

@Alex, я уверен, что вы можете, я добавлю его к ответу. – robbmj

+0

Удивительно, спасибо за вашу помощь !! –

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