4

I have an array of ID's as below:

[121, 432, 322]

I want all of it to be added to an array in the following format (Expected Output):

[
    {
        "term": {
            "brand_id": 121
        }
    },
    {
        "term": {
            "brand_id": 432
        }
    },
    {
        "term": {
            "brand_id": 322
        }
    }
]

I am able to get the structure right and get a result almost as expected. But am ending up having just the last value as the value in all items of the object as below (Current Output):

[
        {
            "term": {
                "brand_id": 322
            }
        },
        {
            "term": {
                "brand_id": 322
            }
        },
        {
            "term": {
                "brand_id": 322
            }
        }
    ]

My code is as below:

The array of IDs is in an array named brands.

let brands_formated = [];
//I have the array stored in `brands`
let format =  { "term" : {
                      "brand_id": 0 //will be replaced
                     }
              };

brands.forEach(function(brand) {
    //The structure for brand query
    format.term.brand_id = brand;
    //Check if the right brand is format. Outputs as desired.
    console.log(format);                            
    brands_formated.push(format);

});

Though console.log in loop confirms am iterating correctly. The final output just has one value.

1
  • you push the same object reference to the array. Commented Aug 12, 2018 at 19:04

2 Answers 2

9

You currently only have one variable for format - you're only ever pushing one item to the array, you're just mutating it multiple times, resulting in the array containing 3 references to the same object.

Create the format on each iteration instead. .map is more appropriate than .forEach when transforming one array into another:

const input = [121, 432, 322];
console.log(
  input.map(brand_id => ({ term: { brand_id }}))
);

Sign up to request clarification or add additional context in comments.

Comments

1

While this answer explained the problem of your code. Here is my way to solve the same problem.

const input = [121, 432, 322];
Array.from(input, brand_id => ({ term: { brand_id }}))

3 Comments

Is there any reason use this over the other? Or a rule of thumb to decide which to use for what? As far as I understood, Array.map is a function similar to Array.foreach etc.., but more effecient. While Array.fromis a method for making another array from an existing array/array-like objects.
Yes.. Array.from is a method for making another array from an existing array/array-like objects, using a map function which is brand_id => ({ term: { brand_id }}).
@esafwan Read this answer Best example of Array.from usage is here

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.