Подтвердить что ты не робот

Получить один элемент из массива имени, значение 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')
4b9b3361

Ответ 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.