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
是一个相当不错的名字。它是一种解压操作,然后沿着不同的轴重新压缩。有点像转换矩阵,或者从行第一存储转换到列第一存储。