Javascript 如何用一组值分解一个对象以创建一个新的对象数组?

Javascript 如何用一组值分解一个对象以创建一个新的对象数组?,javascript,underscore.js,performance,Javascript,Underscore.js,Performance,我正在研究一个解决方案,我提出了一个解决方案,但我相信有一种更优雅的方法可以做到这一点。假设有一个对象,其中所有值都是由逗号分隔的值字符串,如下所示: { "action" : "goto,goto", "target" : "http://www.google.com,http://www.cnn.com" } [ { "action" : "goto", "target" : "http://www.google.com" }, { "action" : "goto", "

我正在研究一个解决方案,我提出了一个解决方案,但我相信有一种更优雅的方法可以做到这一点。假设有一个对象,其中所有值都是由逗号分隔的值字符串,如下所示:

{ "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" }
]
但是,您希望分离这些值并将对象分解为一个对象数组,如下所示:

{ "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)
});

这正是我想要的,看起来并不可怕,但有没有更巧妙的方法来实现这一点呢?

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

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];
    }
}
var newObjects=[];
for(变量k in o){
var VAL=o[k]。拆分(',');
对于(变量i=0,len=vals.length;i

在为这个操作提供一个好的、紧凑的语义名称之前,我不会太担心实现。有什么想法吗?

因此,我对代码进行了一些重构,以创建一个功能更强大、外观更清晰的答案:

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()
将获取一个具有任意数量属性或值的对象,并“unwind”所有现有属性。

这看起来相当简单。我认为
unwind
是一个相当不错的名字。它是一种解压操作,然后沿着不同的轴重新压缩。有点像转换矩阵,或者从行第一存储转换到列第一存储。