John Cooper
John Cooper

Reputation: 7641

How to check whether my key exists in array of object

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"});
}

Upvotes: 20

Views: 80622

Answers (6)

user1063287
user1063287

Reputation: 10879

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>

Upvotes: 0

jaredwilli
jaredwilli

Reputation: 12338

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 

Upvotes: 2

James Allardice
James Allardice

Reputation: 166021

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.

Upvotes: 7

jAndy
jAndy

Reputation: 236092

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'
    });
}

Upvotes: 14

Royi Namir
Royi Namir

Reputation: 148624

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);
}

Upvotes: 1

tvanfosson
tvanfosson

Reputation: 532595

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.

Upvotes: 21

Related Questions