Получить один элемент из массива имени, значение JSON
У меня есть этот массив:
var arr = [];
arr.push({name:"k1", value:"abc"});
arr.push({name:"k2", value:"hi"});
arr.push({name:"k3", value:"oa"});
Можно ли получить значение или определенный элемент, зная имя?
что-то вроде этого:
arr['k2'].value
или
arr.get('k1')
Ответы
Ответ 1
Массивы обычно доступны через числовые индексы, поэтому в вашем примере arr[0] == {name:"k1", value:"abc"}
. Если вы знаете, что свойство name
для каждого объекта будет уникальным, вы можете сохранить их в объекте вместо массива, как показано ниже:
var obj = {};
obj["k1"] = "abc";
obj["k2"] = "hi";
obj["k3"] = "oa";
alert(obj["k2"]); // displays "hi"
Если вам действительно нужен массив объектов, как в вашем сообщении, вы можете прокручивать массив и возвращаться, когда вы найдете элемент с объектом, имеющим требуемое свойство:
function findElement(arr, propName, propValue) {
for (var i=0; i < arr.length; i++)
if (arr[i][propName] == propValue)
return arr[i];
// will return undefined if not found; you could return a default instead
}
// Using the array from the question
var x = findElement(arr, "name", "k2"); // x is {"name":"k2", "value":"hi"}
alert(x["value"]); // displays "hi"
var y = findElement(arr, "name", "k9"); // y is undefined
alert(y["value"]); // error because y is undefined
alert(findElement(arr, "name", "k2")["value"]); // displays "hi";
alert(findElement(arr, "name", "zzz")["value"]); // gives an error because the function returned undefined which won't have a "value" property
Ответ 2
Я знаю, что этот вопрос старый, но никто не упомянул о родном решении. Если вы не пытаетесь поддерживать архаичные браузеры (которых вы не должны быть на этом этапе), вы можете использовать array.filter
:
var arr = [];
arr.push({name:"k1", value:"abc"});
arr.push({name:"k2", value:"hi"});
arr.push({name:"k3", value:"oa"});
var found = arr.filter(function(item) { return item.name === 'k1'; });
console.log('found', found[0]);
Check the console.
Ответ 3
Чтобы ответить на ваш точный вопрос, вы можете получить точное поведение, которое вы хотите, расширив прототип массива с помощью:
Array.prototype.get = function(name) {
for (var i=0, len=this.length; i<len; i++) {
if (typeof this[i] != "object") continue;
if (this[i].name === name) return this[i].value;
}
};
это добавит метод get() ко всем массивам и позволит вам делать то, что вы хотите, i.e:
arr.get('k1'); //= abc
Ответ 4
Найти один элемент
Чтобы найти элемент с заданным именем в массиве, вы можете использовать find
:
arr.find(item=>item.name=="k1");
Обратите внимание, что find
возвращает только один элемент (а именно первое совпадение):
{
"name": "k1",
"value": "abc"
}
Найти все элементы
В вашем исходном массиве есть только одно вхождение элемента каждого имени.
Если массив содержит несколько элементов с одним и тем же именем, и вы хотите их всех, используйте filter
, который вернет массив.
var arr = [];
arr.push({name:"k1", value:"abc"});
arr.push({name:"k2", value:"hi"});
arr.push({name:"k3", value:"oa"});
arr.push({name:"k1", value:"def"});
var item;
// find the first occurrence of item with name "k1"
item = arr.find(item=>item.name=="k1");
console.log(item);
// find all occurrences of item with name "k1"
// now item is an array
item = arr.filter(item=>item.name=="k1");
console.log(item);
Ответ 5
Вы не можете делать то, что вы запрашиваете изначально с помощью массива, но объекты javascript - это хеши, поэтому вы можете сказать...
var hash = {};
hash['k1'] = 'abc';
...
Затем вы можете получить с помощью скобки или точечной нотации:
alert(hash['k1']); // alerts 'abc'
alert(hash.k1); // also alerts 'abc'
Для массивов проверьте библиотеку underscore.js в целом и метод обнаружения. Используя обнаружение, вы можете сделать что-то вроде...
_.detect(arr, function(x) { return x.name == 'k1' });
Или в целом
MyCollection = function() {
this.arr = [];
}
MyCollection.prototype.getByName = function(name) {
return _.detect(this.arr, function(x) { return x.name == name });
}
MyCollection.prototype.push = function(item) {
this.arr.push(item);
}
etc...
Ответ 6
Я ничего не знаю о jquery, поэтому не могу с этим поделать, но что касается Javascript, у вас есть массив объектов, так что вы сможете получить доступ к именам и значениям через каждый массив элемент. Например, arr[0].name
даст вам 'k1'
, arr[1].value
даст вам 'hi'
.
Возможно, вы хотите сделать что-то вроде:
var obj = {};
obj.k1 = "abc";
obj.k2 = "hi";
obj.k3 = "oa";
alert ("obj.k2:" + obj.k2);
Ответ 7
попробуйте это
Array.prototype.get = function(name) {
for (var i=0, len=this.length; i<len; i++) {
if (typeof this[i] != "object") continue;
if (this[i].name === name) return this[i].value;
}
};
Ответ 8
Самый простой подход, который я использовал, это
var found = arr.find(function(element) {
return element.name === "k1";
});
//If you print the found :
console.log(found);
=> Object { name: "k1", value: "abc" }
//If you need the value
console.log(found.value)
=> "abc"
Аналогичный подход можно использовать для поиска значений из массива JSON на основе любых входных данных из JSON.