0

私は提起された別の質問に対する解決策に取り組んでおり、解決策を思いつきましたが、それを行うためのよりエレガントな方法があると確信しています。次のように、すべての値がコンマで区切られた値の文字列であるオブジェクトがあるとします。

{ "action" : "goto,goto", "target" : "http://www.google.com,http://www.cnn.com" }

ただし、次のように、値を分離し、オブジェクトをオブジェクトの配列に分割したいと考えています。

[
    { "action" : "goto", "target" : "http://www.google.com" },
    { "action" : "goto", "target" : "http://www.cnn.com" }
]

私の解決策は次のとおりです。

var actions = obj.action.split(',');
var targets = obj.target.split(',');

// combined the actions and targets arrays
var combinedData = _.zip(actions, targets);

// go through the combinedData array and create an object with the correct keys
var commandList = _.map(combinedData, function(value) { 
    return _.object(["action", "target"], value)
});

これは私が望んでいることであり、ひどいものではありませんが、これを達成するためのよりスマートな方法はありますか?

4

2 に答える 2

0

そこで、コードを少しリファクタリングして、より機能的で見栄えの良い答えを作成しました。

var obj = { "action" : "goto,goto", "target" : "http://www.google.com,http://www.cnn.com" }

// separate and split the values form the object
function separate(obj) { 
    return _.map( _.values( obj ), function(value) {
        return value.split(',');
    });
}
// returns [[ "goto", "goto"], ["http://www.google.com", "http://www.cnn.com"]]

// call separate and recombine the values with zip
function separateAndRecombine(obj) {
    return _.zip.apply(_, separate(obj));
}
// returns [[ "goto", "http://www.google.com"], ["goto", "http://www.cnn.com"]]

// accept an object that has properties with a string of values
// separated by commas, and separate the values to create an array of objects
function unwind(obj) {
    return _.map( separateAndRecombine(obj), function(value) { 
            return _.object(_.keys(obj), value)
    });
};
/* returns:
    [{ "action" : "goto", "target" : "http://www.google.com" },
    { "action" : "goto", "target" : "http://www.cnn.com" }] */

これで、unwind()任意の数のプロパティまたは値を持つオブジェクトを取得し、既存のすべてのプロパティを「巻き戻す」ことができます。

于 2013-11-01T20:19:28.907 に答える