web-dev-qa-db-fra.com

Comment vérifier si ma clé existe dans un objet tableau

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

Comment vérifier si mon key:"key1" existe déjà ou non. S'il n'existe pas, je dois ajouter la clé dans un tableau. 

if(arr.hasOwnProperty("key1")){
      arr.unshift({key:"key1", value:"z"});
}
13
John Cooper

Depuis que vous avez un tableau rempli d'objets, vous devez le faire comme:

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

Pour faciliter les choses, vous devriez stocker vos données de la manière suivante:

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

Ensuite, vous pouvez faire votre vérification et si vos clés ne sont pas en conflit avec les propriétés existantes de l'objet et que vous n'avez pas besoin de valeurs NULL, vous pouvez le faciliter.

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

Si vous avez vraiment besoin de l'objet complet (le vôtre n'est en fin de compte qu'un exemple), je voudrais stocker l'objet en tant que valeur de la clé, pas seulement les objets du tableau. En d’autres termes, faites-en une carte et non un tableau.

19
tvanfosson

Vous pouvez utiliser la méthode ECMAScript 5 filter pour supprimer des éléments du tableau s'ils ne réussissent pas votre test. Si le tableau résultant ne contient aucun élément, vous savez qu'il n'y en avait aucun avec votre valeur:

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

Si vous voulez que cela fonctionne dans les anciens navigateurs, vous devrez utiliser un adaptateur pour vous assurer que Array.prototype.filter est défini.

5
James Allardice
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);
}
1
Royi Namir

Vous pouvez vérifier les tableaux et les objets pour voir si une clé de tableau ou une propriété d'objet existe ou non avec cela. C'est très utile, et il est utilisé de la même manière pour vérifier les deux 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;
}

Utilisation:

En tant que tableau

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

En tant qu'objet

key_exists('jared', {'jared': 'williams'}); //= true 
1
jaredwilli

Vous trouverez ci-dessous deux versions plus explicites de la réponse acceptée de @ jAndy.

J'ai créé la première version pour que je puisse mieux comprendre la logique et ajouté ce qui suit:

si la clé existe, incrémentez la propriété count du .apparié objet, sinon créez un nouvel objet avec un compte de 1.

Dans la deuxième version, j'ai compris que je préférerais que ma variable arrayOfObjects soit une object, afin de pouvoir cibler plus tard les valeurs plutôt que de boucler sur le tableau jusqu'à obtenir une correspondance, puis d'obtenir la valeur d'objet pertinente. Cette version utilise donc un objet au lieu d'un tableau d'objets. 

Version 01 - Un tableau d'objets  

// 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 - Un objet  

// 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>

0
user1063287