Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Loop through an Array, add each item to an object and push it to an array in Javascript

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.

like image 945
esafwan Avatar asked Dec 24 '22 05:12

esafwan


2 Answers

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 }}))
);
like image 148
CertainPerformance Avatar answered Dec 26 '22 00:12

CertainPerformance


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 }}))
like image 21
Arup Rakshit Avatar answered Dec 26 '22 00:12

Arup Rakshit