Как проверить, существует ли мой ключ в объекте массива
var arr = [{
key: "key1", value: "z"
}, {
key: "key2", value: "u"
}, {
...
}];
Как проверить, существует ли мой key:"key1"
уже или нет. Если он не существует, мне нужно добавить ключ в массив ma.
if(arr.hasOwnProperty("key1")){
arr.unshift({key:"key1", value:"z"});
}
Ответы
Ответ 1
Поскольку у вас есть массив, заполненный объектами, вам нужно сделать это так:
(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'
});
}
Ответ 2
Чтобы сделать это проще, вы должны хранить свои данные таким образом:
var map = {
"key1": "z",
"key2": "u"
};
Затем вы можете сделать свой чек и, если ваши ключи не конфликтуют с любыми существующими свойствами объекта, и вам не нужны нулевые значения, вы можете сделать это легче.
if (!map["key1"]) {
map["key1"] = "z";
}
Если вам действительно нужен полный объект (ваш - это всего лишь пример), я бы сохранил объект как значение ключа, а не просто сохранил объекты в массиве. То есть, сделайте это картой, а не массивом.
Ответ 3
Вы можете использовать метод ECMAScript 5 filter
для удаления элементов из массива, если они не проходят ваш тест. Если результирующий массив не имеет элементов, вы знаете, что его значение не было:
if(!arr.filter(function(elem) {
return elem.key === "key1";
}).length) {
arr.push({ key: "key1", value: "z" });
}
Если вы хотите, чтобы он работал в старых браузерах, вам нужно будет использовать прокладку, чтобы убедиться, что Array.prototype.filter
определен.
Ответ 4
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);
}
Ответ 5
Вы можете проверить как массивы, так и объекты, чтобы увидеть, существует ли массив или свойство объекта или нет. Это очень полезно, и он используется одинаково для проверки обоих типов.
/**
* 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;
}
Применение:
Как массив
key_exists('jared', ['jared', 'williams']); //= true
Как объект
key_exists('jared', {'jared': 'williams'}); //= true
Ответ 6
Ниже приведены две более явные версии принятого ответа @jAndy.
Я сделал первую версию для себя, чтобы лучше понять логику и добавил следующее:
если ключ существует, увеличьте свойство count совпадающего объект, в противном случае создайте новый объект со счетом 1.
Во второй версии я понял, что предпочитаю, чтобы моя переменная arrayOfObjects
была object
, так что позже я мог специально ориентировать значения, а не перебирать массив по мере совпадения, а затем получать соответствующие значение объекта. Таким образом, эта версия использует объект вместо массива объектов.
Версия 01 - массив объектов
// 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>