2017-11-07 3 views
0

나쁜 제목이지만 내가하려는 것은 아래에 나와 있습니다.속성을 기반으로 객체 배열에서 객체 만들기

다음과 같은 개체 배열이 있습니다 (이 예제에서는 3 개이지만 숫자가 될 수 있음).

objArray = 
[ 
    { 
    name : "My_Object_1", 
    values : ["bob","tom","phil"], 
    children : { 
     "bob":["terry","carl"], 
     "tom" : ["paul","kevin"], 
     "phil" : [] 
    } 
    }, 
    { 
    name : "My_Object_2", 
    values : ["terry","carl","paul","kevin"], 
    children : { 
     "terry":[], 
     "carl":[], 
     "paul":["jo","tim"], 
     "kevin":[] 
    } 
    }, 
    { 
    name : "My_Object_3", 
    values : ["jo","tim"], 
    children:{} 
    } 
] 

는이 같은 원래 배열의 다음 객체의 아이가있는 경우 각 조합에 대한 개체의 새로운 배열을 생성해야합니다

finalResult = [ 
    { 
    "My_Object_1" : "phil", 
    "My_Object_2" : "", 
    "My_Object_3" : "", 
    }, 
    { 
    "My_Object_1" : "bob", 
    "My_Object_2" : "terry", 
    "My_Object_3" : "", 
    }, 
    { 
    "My_Object_1" : "bob", 
    "My_Object_2" : "carl", 
    "My_Object_3" : "", 
    }, 
    { 
    "My_Object_1" : "tom", 
    "My_Object_2" : "kevin", 
    "My_Object_3" : "", 
    }, 
    { 
    "My_Object_1" : "tom", 
    "My_Object_2" : "paul", 
    "My_Object_3" : "jo", 
    }, 
    { 
    "My_Object_1" : "tom", 
    "My_Object_2" : "paul", 
    "My_Object_3" : "tim", 
    } 
] 

어떤 도움이 좋을 것!

+0

개체에 루프를 사용하고 잘 작동이 –

답변

1

다음 단계의 항목을 확인하는 동안 재귀 적 접근이 가능합니다. 끝에는 객체가있는 배열을 반환합니다.

순서는 주어진 values 속성의 순서로 정의됩니다.

var array = [{ name: "My_Object_1", values: ["bob", "tom", "phil"], children: { bob: ["terry", "carl"], tom: ["paul", "kevin"], phil: [] } }, { name: "My_Object_2", values: ["terry", "carl", "paul", "kevin"], children: { terry: [], carl: [], paul: ["jo", "tim"], kevin: [] } }, { name: "My_Object_3", values: ["jo", "tim"], children: {} }], 
 
    result = function create(array) { 
 
     function iter(keys, path) { 
 
      var index; 
 

 
      path = path || []; 
 
      index = path.length; 
 

 
      (keys || array[index].values).forEach(function (k) { 
 
       var ref = array[index].children[k], 
 
        temp = path.concat(k), 
 
        object = {}; 
 

 
       if (ref && ref.length) { 
 
        return iter(ref, temp); 
 
       } 
 
       [1, 2, 3].forEach(function (v, i) { object['key' + v] = temp[i] || ''; }); 
 
       result.push(object); 
 
      }); 
 
     }; 
 

 
     var result = []; 
 
     iter(); 
 
     return result; 
 
    }(array); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

브릴리언트 수행의 방법이 될 수 배열을 사용하여. 고마워요! – jemble