20
var arr = [{
   key: "key1", value: "z"
}, {
   key: "key2", value: "u"
}, {
   ...
}];

How to check whether my key:"key1" exists already or not. If it does not exist, i need to add the key in ma array.

if(arr.hasOwnProperty("key1")){
      arr.unshift({key:"key1", value:"z"});
}
Vladimir Panteleev
  • 24,651
  • 6
  • 70
  • 114
John Cooper
  • 7,343
  • 31
  • 80
  • 100

6 Answers6

21

To make it easier you should store your data thusly:

var map = {
       "key1": "z",
       "key2": "u"
};

Then you can do your check and if your keys don't conflict with any existing properties on the object and you don't need null values you can make it easier.

if (!map["key1"]) {
   map["key1"] = "z";
}

If you really need the full object (yours is after all just an example), I would store the object as the value of the key, not just store the objects in the array. That is, make it a map, not an array.

tvanfosson
  • 524,688
  • 99
  • 697
  • 795
14

Since you've got an Array filled with Objects, you need to do it like:

(ES3)

function lookup( name ) {
    for(var i = 0, len = arr.length; i < len; i++) {
        if( arr[ i ].key === name )
            return true;
    }
    return false;
}

if( !lookup( 'key1' ) ) {
    arr.push({
        key: 'key1',
        value: 'z'
    });
}
jAndy
  • 231,737
  • 57
  • 305
  • 359
7

You could use the ECMAScript 5 filter method to remove elements from the array if they do not pass your test. If the resulting array has no elements, you know that there were none with your value:

if(!arr.filter(function(elem) {
    return elem.key === "key1";
}).length) {
    arr.push({ key: "key1", value: "z" });
}

If you want it to work in older browsers you would need to use a shim to make sure Array.prototype.filter is defined.

James Allardice
  • 164,175
  • 21
  • 332
  • 312
1

You can check both arrays and objects to see if an array key or object property exists or not with this. It's very useful, and it is used the same way for checking both types.

/**
 * Check if an array key or object property exists
 * @key - what value to check for
 * @search - an array or object to check in
 */
function key_exists(key, search) {
    if (!search || (search.constructor !== Array && search.constructor !== Object)) {
        return false;
    }
    for (var i = 0; i < search.length; i++) {
        if (search[i] === key) {
            return true;
        }
    }
    return key in search;
}

Usage:

As an array

key_exists('jared', ['jared', 'williams']); //= true

As an object

key_exists('jared', {'jared': 'williams'}); //= true 
jaredwilli
  • 11,762
  • 6
  • 42
  • 41
1
var key;
for(var i = 0; i < arr.length; i++)
{
    if(arr[i].key == "key1")
    {
        key = arr[i];
        break;
    }
}
if(typeof (key)=='undefined') //for if the value is 0 as int
{
    key = {
        key: "key1", value: "aaa"
    };
    arr.push(key);
}
Royi Namir
  • 144,742
  • 138
  • 468
  • 792
0

Below are two, more explicit, versions of @jAndy's accepted answer.

I made the first version for myself so I could understand the logic better and added the following:

if the key does exist, increment the count property of the matched object, otherwise create a new object with a count of 1.

In the second version, I realised I would prefer my arrayOfObjects variable to be an object, so that later I could specifically target values rather than looping over the array till I got a match, and then getting the relevant object value. So that version uses an object instead of an array of objects.

Version 01 - An array of objects

// based on: https://stackoverflow.com/a/9177103/1063287

// the original array of objects
var arrayofObjects = [{
    id: "CY01",
    count: 1
  },
  {
    id: "CY33",
    count: 5
  },
  {
    id: "CY55",
    count: 8
  }
];

// show the array in the interface
$(".before").text(JSON.stringify(arrayofObjects));

// define lookup function (must have access to arrayofObjects)
function lookup(key_to_check) {
  // for each object in the array of objects
  for (var i = 0; i < arrayofObjects.length; i++) {
    // if the object key matches the key to check
    if (arrayofObjects[i]["id"] === key_to_check) {
      // return true with index of matching object
      var returnObject = {};
      returnObject["exists"] = true;
      returnObject["index"] = i;
      return returnObject;
    }
  }
  // if the above loop has not already returned a value
  // return false
  var returnObject = {};
  returnObject["exists"] = false;
  return returnObject;
}

// on click, check whether the key exists
$(document).on("click", ".run", function() {

  var key_to_check = $(".key_to_check").val();

  $(".checking").text(key_to_check);

  var returnObject = lookup(key_to_check);

  // if key to check doesn't exist add it
  if (returnObject["exists"] === false) {
    console.log("key doesn't exist, adding object");
    arrayofObjects.push({
      id: key_to_check,
      count: 1
    });
  } else if (returnObject["exists"] === true) {
    // else if it does exists, increment the relevant counter
    console.log("key does exist, incrementing object count value");
    var index = returnObject.index;
    arrayofObjects[index].count += 1;
  }

  $(".after").text(JSON.stringify(arrayofObjects));
});
body {
  font-family: arial;
  font-size: 14px
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>enter an existing or non-existing key and click run.</p>
<p>if existing, increment count, otherwise create new object with count of 1.</p>

<input class="key_to_check"><button class="run">run</button>

<br><br>
<div>array of objects - before: <span class="before"></span> </div>

<div>checking:<span class="checking"></span></div>

<div>array of objects - after: <span class="after"></span></div>

Version 02 - An object

// based on: https://stackoverflow.com/a/9177103/1063287

// the original object
var myObject = {
  "CY01": 1,
  "CY33": 5,
  "CY55": 8
};

// show the object in the interface
$(".before").text(JSON.stringify(myObject));

// define lookup function (must have access to myObject)
function lookup(key_to_check) {
  // for each property in the object
  for (key in myObject) {
    // if the key matches the key to check
    if (key === key_to_check) {
      // return true
      return true
    }
  }
  // if the above loop has not already returned a value
  // return false
  return false
}

// on click, check whether the key exists
$(document).on("click", ".run", function() {

  var key_to_check = $(".key_to_check").val();

  $(".checking").text(key_to_check);

  var returnObject = lookup(key_to_check);

  // if key to check doesn't exist add it
  if (returnObject === false) {
    console.log("key doesn't exist, adding object");
    myObject[key_to_check] = 1;
  } else if (returnObject === true) {
    // else if it does exists, increment the relevant counter
    console.log("key does exist, incrementing object count value");
    myObject[key_to_check] += 1;
  }

  $(".after").text(JSON.stringify(myObject));
});
body {
  font-family: arial;
  font-size: 14px
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>enter an existing or non-existing key and click run.</p>
<p>if existing, increment count, otherwise create new property with count of 1.</p>

<input class="key_to_check"><button class="run">run</button>

<br><br>
<div>my object - before: <span class="before"></span> </div>

<div>checking:<span class="checking"></span></div>

<div>my object - after: <span class="after"></span></div>
user1063287
  • 10,265
  • 25
  • 122
  • 218