2015-03-30 3 views
3

у меня есть два массива объектов следующим образом:объединить два объекта в lodash

$scope.var1 = [{ 
    "field_name": "fname", 
    "mapped_field": "firstName", 
    "position": 2 
}, { 
    "field_name": "lname", 
    "mapped_field": "lastName", 
    "position": 1 
}, { 
    "field_name": "email", 
    "mapped_field": "Email", 
    "position": 1 
}]; 

$scope.final = [{ 
    "field_name": "fname", 
    "mapped_field": "lastName", 
    "position": 2 
}, { 
    "field_name": "lname", 
    "mapped_field": "firstName", 
    "position": 1 
}]; 

Здесь я хочу, чтобы заменить окончательные один, где mapped_field сочетается с mapped_field var1 в и остальных из var1 также объединен в окончательные один ,

Final должно быть так:

$scope.final = [{ 
    "field_name": "fname", 
     "mapped_field": "firstName", 
     "position": 2 
}, { 
    "field_name": "lname", 
    "mapped_field": "lastName", 
    "position": 1 
}, { 
    "field_name": "email", 
    "mapped_field": "Email", 
    "position": 1 
}]; 

Любая помощь будет высоко оценена.

+0

Вы пробовали '_.assign (destObj, srcObj)'? –

ответ

2

Используйте комбинацию lodash функций: _.forEach и _.assign:

_.forEach($scope.var1, function(varObject) { 
    //find object with the same mapped_field 
    var finalArrayItem = _.find($scope.final, {mapped_field: varObject.mapped_field}); 
    if (finalArrayItem) { 
     //merge objects 
     _.assign(finalArrayItem, varObject); 
    } else { 
     $scope.final.push(varObject); 
    } 
}); 

Ссылка на jsbin

+0

спасибо Кирилл. это работает. –

+0

Не заменяет существующее mapped_field в последнем. он должен искать, если уже есть mapped_field, которые сопоставляются с var1, затем удаляют его и добавляют новый. –

+0

@KrishnaBhatt, я думал, что mapped_field - это уникальное поле, которое показывает, как объекты должны быть связаны. В противном случае - как мне найти объекты из '$ scope.var1' в' $ scope.final'? – Kiril

1

Вот что я придумал:

final = _.map(var1, function(item) { 
    return _.assign(
     _.find(final, _.pick(item, 'mapped_field')) || {}, 
     item 
    ); 
}); 

Где вы используете map() для создайте новый массив final. Массив, который отображается, - var1, и мы возвращаем новый объект для каждого элемента массива. Функция assign() используется для переопределения свойств в final со свойствами от var1.

Для того, чтобы сопоставить текущий final товара с его номером var1 шт., Вы используете find(). Функция pick() удобна для создания объекта фильтра. Здесь вы говорите, что хотите сопоставлять свойство mapped_field.

Логический || необходим для случая, когда нет соответствия. Например, объект email. Это просто скопирует все свойства var1 в пустой объект и вернет это.

+0

спасибо. это лучшее и короткое решение. Я читаю вам книгу, но все еще на этапе обучения. –

+0

Кажется, что он переопределяет значения конечного объекта. В финале уже есть значения, и я хочу их сохранить. –

+0

@ KrishnaBhatt, вы можете изменить порядок значений, переданных 'assign()'. Первый аргумент всегда будет получать накопленные изменения, включая переопределения свойств. Вы можете изменить код на 'assign (item, _.find (final ...', так что объекты из final всегда имеют приоритет.Или вы можете заменить 'assign()' на 'defaults()', который будет добавлять только новые свойства вместо переопределения существующих свойств. –

-2

Проект с открытым исходным кодом http://www.jinqJs.com. Я автор проекта.

Вот пример того, как сделать это с jinqJs:

$scope.data = jinqJs() 
      .from(data5) 
      .leftJoin(data6) 
       .on('mapped_field') 
      .select(); 
+0

Это приятно, но автор спрашивает, как это сделать с помощью lodash – MaxMarchuk

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