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

1

功能风格很棒。这是一个更直接的方法。

var newObjects = [];
for(var k in o) {
    var vals = o[k].split(',');
    for(var i = 0, len = vals.length; i < len; i++) {
        newObjects[i] = newObjects[i] || {};
        newObjects[i][k] = vals[i];
    }
}

在你为这个操作想出一个漂亮、紧凑、语义化的名字之前,我不会太担心这个实现。有任何想法吗?

于 2013-11-01T18:26:25.923 回答
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 回答