Home > Net >  Iterate through an array of objects Nodejs
Iterate through an array of objects Nodejs

Time:07-15

Need some help with this, been stuck for hours. Trying to iterate through an array of objects in node to grab one of the key's value and perform a regex function. I keep getting undefined reading errors, the latest one is "Cannot read properties of undefined (reading 'split')"

The array is created by calling toArray() on a MongoDB collection find function:

  "ups": [
    {
      "_id": "61b5ef3a8bec102408f5289e",
      "article_code": "4325832",
      "order_number": "",
      "status": "shipped",
      "tt_url": "https://www.ups.com/track?loc=en_US&tracknum=999&requester=ST/trackdetails",
      "unique_id": ""
    },
    {
      "_id": "61b5ef3a8bec102408f528b4",
      "article_code": "6242665",
      "order_number": "",
      "status": "shipped",
      "tt_url": "https://www.ups.com/track?loc=en_US&tracknum=999&requester=ST/trackdetails",
      "unique_id": ""
    },
    {
      "_id": "61b5ef3a8bec102408f528ef",
      "article_code": "3610890",
      "order_number": "",
      "status": "shipped",
      "tt_url": "https://www.ups.com/track?loc=en_US&tracknum=999&requester=ST/trackdetails",
      "unique_id": ""
    }
  ]

Here's my code attempt:

 for(let i = 0; i < ups.length; i  ){
       
        var ups_tt = i['tt_url'];
        var unique_id = i['unique_id'];
        
        var spl = ups_tt.split(/tracknum=(.*)/)[1];
        ups_tt = spl.split("&")[0];

Any help would be appreciated, thank you.

CodePudding user response:

so, in your example, i is just a number, so if you try to get a key of a number, then you will get undefined

> let i = 1;
undefined
> i["test"]
undefined

what you should do is reference the array ups with the index:

 for(let i = 0; i < ups.length; i  ){
       
        var ups_tt = ups[i].tt_url;
        var unique_id = ups[i].unique_id;
        
        var spl = ups_tt.split(/tracknum=(.*)/)[1];
        ups_tt = spl.split("&")[0];

CodePudding user response:

Try this way

let y = {
    "ups": [
        {
            "_id": "61b5ef3a8bec102408f5289e",
            "article_code": "4325832",
            "order_number": "",
            "status": "shipped",
            "tt_url": "https://www.ups.com/track?loc=en_US&tracknum=999&requester=ST/trackdetails",
            "unique_id": ""
        },
        {
            "_id": "61b5ef3a8bec102408f528b4",
            "article_code": "6242665",
            "order_number": "",
            "status": "shipped",
            "tt_url": "https://www.ups.com/track?loc=en_US&tracknum=999&requester=ST/trackdetails",
            "unique_id": ""
        },
        {
            "_id": "61b5ef3a8bec102408f528ef",
            "article_code": "3610890",
            "order_number": "",
            "status": "shipped",
            "tt_url": "https://www.ups.com/track?loc=en_US&tracknum=999&requester=ST/trackdetails",
            "unique_id": ""
        }
    ]
}

    y.ups.forEach(element => {
        console.log(element)
    });

CodePudding user response:

since the url is simple enough, you can just directly split it by "&", no need to use regex

so:

ups_tt = ups_tt.split('&')[2];
var spl = "&"   ups_tt;

CodePudding user response:

The error is on row var spl = ups_tt.split(/tracknum=(.*)/)[1];, because ups_tt is undefined.

for(let i = 0; i < ups.length; i  ){
      
    var ups_tt = i['tt_url'];
    var unique_id = i['unique_id'];

    var spl = ups_tt.split(/tracknum=(.*)/)[1];
    ups_tt = spl.split("&")[0];

i is the index, it's a number. So, I think you meant to add either let elem = ups[i] inside the loop, or ups[i]:

for(let i = 0; i < ups.length; i  ){
    // A
    let elem = ups[i];
    var ups_tt = elem['tt_url'];
    var unique_id = elem['unique_id'];

    // B
    var ups_tt = ups[i]['tt_url'];
    var unique_id = ups[i]['unique_id'];

    // rest of the loop

Also, you could use for .. of.

The for...of statement creates a loop iterating over iterable objects, including: built-in String, Array, array-like objects (e.g., arguments or NodeList), TypedArray, Map, Set, and user-defined iterables. It invokes a custom iteration hook with statements to be executed for the value of each distinct property of the object.

Your code would look like this:

for (let elem of ups) {
    var ups_tt = elem['tt_url'];
    var unique_id = elem['unique_id'];

    var spl = ups_tt.split(/tracknum=(.*)/)[1];
    ups_tt = spl.split("&")[0];

    // rest of the loop

Last point, because there's some answers using dot notation: since ups is the array with various elements where every element is an object, instead of elem['tt_url'], you can access their properties using dot, like elem.tt_url, but that's a mostly matter of preference. In some cases, however, the only option is to use array notation: if you're using a string inside a variable as key, or if the property has some special characters. See this question for more info.

  • Related