0

I am trying to create a new json object (selectedProductAttributes) that is created when the contents of a 2nd json object (selectedProductAttributesNames) are compaired against a 3rd object (allProductAttributes)! To explain in more detail I have some examples below

The first one called allProductAttributes is a json object that contains differnt attributes for form fields

$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,
        }

]

The next json object, selectedProductAttributesNames, contains a list of the form fields that the user wants to select from allProductAttributes

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

So from the above example, when the user requests 'postcode' and 'service' in selectedProductAttributesNames, a new json object should be created containing the form field attributes from allProductAttributes...

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

I'm sorry if I have confused you. Does anyone know how I can achieve this? Thanks

0

2 Answers 2

2

Unless you want to reinvent the wheel, you could use underscore and do something like that :

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

If you don't care about supporting IE 6, 7 nor 8, and don't want to use any external library, you could do this:

$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
})
Sign up to request clarification or add additional context in comments.

1 Comment

I wasn't familiar with compact method, I prefer this to mine since it's not altering the data.
0

If you have the ability to change the attribute source object a bit to match the following style, using dictionary style access to your objects and a loop will get you what you are looking for.

$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]];
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.