2017-01-23 11 views
0

Я пытаюсь объединить два массива в один. Первая имеет конфигурацию по умолчанию, а вторая имеет фактическую. Я нашел очень похожую проблему here, но в моем конкретном случае это не работает. КонфигурацияОбъединить объекты внутри двух массивов с помощью lodash

По умолчанию:

[ 
    { configurationOption: 'X provisioning', platform: 'X', value: true }, 
    { configurationOption: 'Y provisioning', platform: 'Y', value: true }, 
    { configurationOption: 'Z provisioning', platform: 'Z', value: true } 
] 

Фактическая конфигурация:

[ 
    { platform: 'X', value: false }, 
    { platform: 'Y', value: true } 
] 

Ожидаемый результат:

[ 
    { configurationOption: 'X provisioning', platform: 'X', value: false }, 
    { configurationOption: 'Y provisioning', platform: 'Y', value: true }, 
    { configurationOption: 'Z provisioning', platform: 'Z', value: true } 
] 

Поэтому в основном то, что нужно сделать, это обновление свойство 'значение' в конфигурации по умолчанию , на основе фактической, сложной части является то, что некоторые из параметров конфигурации не существуют в фактической конфигурации и фактической конфигурации отсутствует свойство «configurationOption».

var config = _.unionBy(actual, defaultConf, 'platform'); 

Эта линия является самой близкой, которую я мог бы получить, но отсутствует свойство «configurationOption».

Здесь CodePen так что вы можете играть с ним: https://codepen.io/anon/pen/oBwLMb?editors=0012

+0

возможно попытаться дать метод intstead из «platofrm» строки в качестве третьего аргумента ? ты уверен, что он не работает? Кажется, здесь работает -> http://codepen.io/kejt/pen/PWjGWa?editors=1111 – Kejt

+1

Не '_.merge (defaultConf, actual)', создающий желаемый результат? –

+0

Является ли каждый элемент в массиве фактических данных, который должен находиться в одном-единственном соответствии платформе с элементами в массиве по умолчанию? Другими словами, будет ли массив фактических данных всегда содержать платформу X и Y в этом порядке? –

ответ

1

Создать новый массив объектов, основанный на defaults, каждый элемент которого является результатом слияния, что по умолчанию с соответствующими фактическими данными найденного в actuals, на основе соответствия platform.

const defaults = [ 
 
    {configurationOption: 'X provisioning', platform: 'X', value: true}, 
 
    {configurationOption: 'Y provisioning', platform: 'Y', value: true}, 
 
    {configurationOption: 'Z provisioning', platform: 'Z', value: true}]; 
 

 
const actuals = [ 
 
    {platform: 'X', value: false}, 
 
    {platform: 'Y', value: true}]; 
 

 
var result = defaults.map(deflt => Object.assign(
 
    {}, 
 
    deflt, 
 
    actuals.find(actual => actual.platform === deflt.platform))); 
 

 
console.log(result); 
 
    

Это может быть переписана с использованием lodash, если вы так хотите, используя _.map_.assign, и _.find.

1

Вы можете использовать _.merge(). Так что ваш код может быть записан в виде:

var config = _.merge({}, defaultConf, actual); 
console.log(config); 

http://jsbin.com/yuyegamaka/edit?js,console

Update: Если вы хотите массив в качестве результата, то

var config = _.merge([], defaultConf, actual); 
+0

Почему первый параметр - пустой объект? Мне нужна моя конфигурация как список, я думаю, что это вернет объект в качестве конечного результата. –

+0

, но будет ли это слияние в поле 'platform', как кажется, что OP? –

+0

@torazaburo Не уверен, если я понимаю цель вопроса иначе –