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