2015-10-23 3 views
1

Я изучаю Lodash, который является библиотекой javascript.lodash: создать массив на основе дочернего массива объекта

Здесь я имею объект как:

Сценарий № 1:

{ 
    name: 'abc' 
    email: '[email protected]' 
    z: [ 
     { 
      time: '<any-time>', 
      t: 't1' 
     }, 
     { 
      time: '<any-time>', 
      t: 't2' 
     }, 
     { 
      time: '<any-time>', 
      t: 't3' 
     } 
    ] 
} 

Я хочу, чтобы этот результат с помощью lodash:

[ 
    { 
     name: 'abc' 
     email: '[email protected]' 
     z: [ 
      { 
       time: '<any-time>', 
       t: 't1' 
      }   
     ] 
    }, 
    { 
     name: 'abc' 
     email: '[email protected]' 
     z: [ 
      { 
       time: '<any-time>', 
       t: 't2' 
      }   
     ] 
    }, 
    { 
     name: 'abc' 
     email: '[email protected]' 
     z: [ 
      { 
       time: '<any-time>', 
       t: 't3' 
      }   
     ] 
    } 
] 

Сценарий № 2:

{ 
    name: 'abc' 
    email: '[email protected]' 
    z: [ 
     { 
      time: '<any-time>', 
      t: 't1' 
     }, 
     { 
      time: '<any-time>', 
      t: 't1' // see here t1 repeated 
     }, 
     { 
      time: '<any-time>', 
      t: 't3' 
     } 
    ] 
} 

, то результат должен быть:

[ 
    { 
     name: 'abc' 
     email: '[email protected]' 
     z: [ 
      { 
       time: '<any-time>', 
       t: 't1' 
      }, 
      { 
       time: '<any-time>', 
       t: 't1' 
      }   
     ] 
    }, 
    { 
     name: 'abc' 
     email: '[email protected]' 
     z: [ 
      { 
       time: '<any-time>', 
       t: 't3' 
      }   
     ] 
    } 
] 

Позвольте мне знать, если мои детали не растаможен к вам.

спасибо :)

EDIT: Я попытался следующий код,

var finalArr = []; 
var baseInfo = _.omit(obj, 'z'); 
var childArr = obj.z; 
for(var j = 0; j < childArr.length; j++){ 
    var flattenObj = angular.copy(baseInfo); 
    flattenObj.z = []; 
    flattenObj.z.push(childArr[j]); 
    finalArr.push(flattenObj); 
} 

Он просто обрабатывает сценарий # 1. И я думаю, что он использует больше javascript, чем lodash.

+0

@ user2415266 проверки мое редактирование –

ответ

0

Этот код работает для обоих сценариев:

// I assume obj is the input object 
var result = _.map(obj.z, function(value) { 
    return { 
     z : value, 
     name : obj.name, 
     email : obj.email 
    }; 
}); 

Обратите внимание, что вам не нужно lodash вообще для этого примера. Вы можете просто написать это:

// I assume obj is the input object 
var result = obj.z.map(function(value) { 
    return { 
     z : value, 
     name : obj.name, 
     email : obj.email 
    }; 
}); 
+0

работает хорошо для сценария №1, но не в # 2. Если 't' имеет одинаковые значения, он должен идти в том же массиве' z'. –

0

В lodash цепи, группа внутреннего массива по t, а затем отобразить каждую группу на новый объект:

function collectAndCombine(obj) { 
 
    return _(obj.z) 
 
    .groupBy('t') 
 
    .map(function(arr) { 
 
    return _.assign(_.pick(obj, ['name', 'email']), { z: arr }); 
 
    }) 
 
    .value(); 
 
} 
 

 
var obj1 = { 
 
    name: 'abc', 
 
    email: '[email protected]', 
 
    z: [ 
 
     { 
 
      time: '<any-time>', 
 
      t: 't1' 
 
     }, 
 
     { 
 
      time: '<any-time>', 
 
      t: 't2' 
 
     }, 
 
     { 
 
      time: '<any-time>', 
 
      t: 't3' 
 
     } 
 
    ] 
 
}; 
 

 
var obj2 = { 
 
    name: 'abc', 
 
    email: '[email protected]', 
 
    z: [ 
 
     { 
 
      time: '<any-time>', 
 
      t: 't1' 
 
     }, 
 
     { 
 
      time: '<any-time>', 
 
      t: 't1' // see here t1 repeated 
 
     }, 
 
     { 
 
      time: '<any-time>', 
 
      t: 't3' 
 
     } 
 
    ] 
 
}; 
 

 
console.log(collectAndCombine(obj1)); 
 
    
 
console.log(collectAndCombine(obj2));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.6/lodash.min.js"></script>

+0

Спасибо за ответ. Я попробую. Это выглядит потрясающе :) –

+0

Добро пожаловать :) Я не был уверен, что это все еще актуально. –

Смежные вопросы