Search code examples
javascriptarraysarrayobject

How to change the value of an Array object in Javascript


I have an array object call listOfObjects.

[{"name":"A", "data":"[{"value1":"1","value2":"2"}]"},
 {"name":"B", "data":"[{"value1":"1","value2":"2"}]"}]

What I want to do is insert an object into the array where the array is empty.If the array is not empty then do a check on the item inside. If item already exist, do update on the item, else add it to the array. Below is my code

  var searchName= "A"; 
  if (listOfObjects.length > 0) {
            for (var i = 0; i < listOfObjects.length; i++) {
                if (listOfObjects[i].name == searchName) {
                    listOfObjects[i].data = data;
                    break;
                } else {
                    insert = {
                        'name': searchName,
                        'data': data
                    };
                    listOfObjects.push(insert);
                }
            }
    } else {
        insert = {
            'name': searchName,
            'data': data
        };
        listOfObjects.push(insert);
   }

When I run it, even though A already exist, it update the existing item but also add one more time to the listOfObjects. Is there anyway that can achieve what I want? Thanks..


Solution

  • The problem is you're inserting into the array inside your for loop looking for a match. Instead, remember whether you've seen a match and insert after the loop if you haven't. There's also no reason for the length check and no reason to repeat your logic for inserting:

    var searchName= "A"; 
    var found = false;
    for (var i = 0; !found && i < listOfObjects.length; i++) {
        if (listOfObjects[i].name == searchName) {
            listOfObjects[i].data = data;
            found = true;
        }
    }
    if (!found) {
        listOfObjects.push({
            'name': searchName,
            'data': data
        });
    }
    

    Note that you can use Array#find (which can be polyfilled for old browsers) to find the entry rather than a for loop if you like:

    var searchName= "A"; 
    var entry = listOfObjects.find(function(entry) {
        return entry.name == searchName;
    });
    if (entry) {
        entry.data = data;
    } else {
        listOfObjects.push({
            'name': searchName,
            'data': data
        });
    }