2015-02-09 4 views
0

Я пытаюсь создать новый объект JSON (selectedProductAttributes), который создается, когда содержимое 2-го объекта JSon (selectedProductAttributesNames) являются compaired против 3-го объекта (всеProductAttributes)! Для того, чтобы более подробно объяснить, у меня есть некоторые примеры нижеСоздание объекта JSon путем сравнения еще два JSON объектов

Первая называется allProductAttributes является объектом JSON, который содержит различные атрибуты для полой формы

$scope.allProductAttributes = [ 
     { 
      name: 'postcode', 
      title: 'Postcode', 
      required: true, 
      type: 'text', 
      max: '10', 
      placeholder: 'Enter a postcode' 
     }, 
     { 
      name: 'Term', 
      title: 'Contract term', 
      required: true, 
      type: 'number', 
     }, 
     { 
      name: 'bandwidth', 
      title: 'bandwidth', 
      type: 'select', 
      options: [ 
       {id: 10, name: '10 mb/s'}, 
       {id: 100, name: '100 mb/s'}, 
       {id: 1000, name: '1000 mb/s'}, 
       {id: 10000, name: '10000 mb/s'} 
      ] 
     }, 
     { 
      name: 'service', 
      title: 'Service', 
      required: true, 
     } 

]

Следующего объекта JSON, selectedProductAttributesNames, содержит список полей формы, которые пользователь хочет выбрать из allProductAttributes

$scope.selectedProductAttributesNames = [ 
"postcode", 
"service" 
] 

Так из приведенного выше примера, когда пользователь запрашивает «почтовый индекс» и «сервис» в selectedProductAttributesNames, новый объект JSON должны быть созданы, содержащим поле формы атрибутов allProductAttributes ...

$scope.selectedProductAttributes = [ 
    { 
      name: 'postcode', 
      title: 'Postcode', 
      required: true, 
      type: 'text', 
      max: '10', 
      placeholder: 'Enter a postcode' 
     }, 
    { 
      name: 'service', 
      title: 'Service', 
      required: true, 
     } 
] 

Я извините, если я вас смутил. Кто-нибудь знает, как я могу это достичь? Спасибо

+1

Используйте 'Array.filter'. – Halcyon

ответ

2

Если вы не хотите изобретать велосипед, можно использовать подчеркивание и сделать что-то вроде этого:

$scope.selectedProductAttributes = _.compact($scope.allProductAttributes.map(function (item) { 
    return _.contains($scope.selectedProductAttributesNames, item.name) ? 
      item : false})) 

Если вы не заботитесь о поддержке IE 6, 7, ни 8, и Дон» t хотите использовать любую внешнюю библиотеку, вы можете сделать это:

$scope.selectedProductAttributes = $scope.allProductAttributes.filter(function (item) { 
    var validated = false, i, length = $scope.selectedProductAttributesNames.length; 
    for (i = 0 ; i < length; i++) { 
     if (item.name == $scope.selectedProductAttributesNames[i]) 
      validated = true; 
    } 
    return validated 
}) 
+0

Я не был знаком с методом 'compact', я предпочитаю, чтобы это было моим, поскольку оно не меняет данные. –

+0

Отлично - спасибо –

0

Если у вас есть возможность изменить исходный объект атрибута немного, чтобы соответствовать следующему стилю, используя доступ к стилю словарного типа, и цикл поможет вам получить то, что вы ищете.

$scope.selectedProductAttributeNames = { 
    'postcode' : { 
     'name': 'postcode', 
     /// remaining things here 
    }, 
    /// remaining attributes here 
}; 

for (var i = 0, l= $scope.selectedProductAttributeNames.length; i < l; i++) { 
    $scope.selectedProductAttributes[x[i]] =  
    $scope.selectedProductAttributeNames[x[i]]; 
} 
+0

спасибо за ваш ответ –

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