2013-11-01 6 views
0

나는 another question posed에 대한 해결책을 찾고 있었고, 해결책을 생각해 냈습니다.하지만 더 우아한 방법이 있다고 확신합니다.문자열의 값으로 객체를 분할하여 새로운 객체 배열을 만드는 방법은 무엇입니까?

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

이 내가 원하는 끔찍한 보이지 않는 것을 수행하지만,이 달성의 야바위꾼 방법이?

답변

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]; 
    } 
} 

이 작업에 대해 멋진, 압축 된 의미 론적 이름이 나오기 전까지는 구현에 대해 걱정하지 않아도됩니다. 어떤 아이디어? 이제

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() 어떤 속성이나 값의 수와 모든 '풀림'로 객체를 취합니다

+0

이것은 매우 간단합니다. 나는 '긴장 풀기'가 꽤 괜찮은 이름 일 것이라고 생각한다. – EmptyArsenal

+0

이것은 일종의 압축 풀기 연산이고 다른 축을 따라 압축 풀기 작업입니다. 행렬을 전치하거나 행 우선 저장소에서 열 우선 저장소로 전환하는 것과 같은 종류입니다. –

0

그래서, 나는 더 많은 기능과 청소기 찾고 답을 만들기 위해 내 코드의 작은 리팩토링을했다 기존 속성 중

관련 문제