JSON || Как получить индекс объекта json array с требуемым значением? [Дубликат]

Ниже были исправлены эта проблема для меня, я пытался создать установку с расширением cython.

  1. Установить Microsoft Visual C ++ Compiler для Python 2.7
  2. Место установки по умолчанию будет @ C: \ Users \ PC-user \ AppData \ Local \ Programs \ Common \ Microsoft \ Visual C ++ для Python. Это может действительно устранить проблему, протестируйте один раз перед продолжением.
  3. Если это не удается, проверьте, где находится файл VC ++ для файла python vcvarsall.bat
  4. Откройте файл msvc9compiler.py пакета distutils в блокноте.
  5. В моем окне это было @ C: \ Anaconda2 \ Lib \ distutils \ msvc9compiler.py функция find_vcvarsall в этом файле, определить версию VC, распечатав аргумент версии. Для Python 2.7 это может быть 9.0
  6. Теперь создайте переменную окружения VS90COMNTOOLS, указывая на C: \ Users \ PC-user \ AppData \ Local \ Programs \ Common \ Microsoft \ Visual C ++ для Python \ 9.0 \ VC \ bin
  7. По какой-то причине distutils ожидает, что файл vcvarsall.bat будет находиться в каталоге VC, но VC ++ для инструментов python имеет его в корне 9.0. Чтобы исправить это, удалите «VC» из этого пути. join (примерно вокруг строки 247) #productdir = os.path.join(toolsdir, os.pardir, os.pardir, "VC") productdir = os.path.join(toolsdir, os.pardir, os.pardir)

Вышеупомянутые шаги исправили проблему для меня.

35
задан return1.at 29 June 2012 в 09:23
поделиться

5 ответов

Функциональный подход

В эти дни все классные дети выполняют функциональное программирование ( hello React users ), поэтому я думал, что дам функциональное решение. На мой взгляд, это на самом деле намного приятнее, чем предвариантные петли for и each, которые были предложены до сих пор, и с синтаксисом ES6 он довольно изящный.

Update

теперь отличный способ сделать это под названием findIndex , который принимает функцию, возвращающую true / false на основе соответствия элемента массива (как всегда, проверьте совместимость с браузером).

var index = peoples.findIndex(function(person) {
  return person.attr1 == "john"
}

С синтаксисом ES6 вы можете написать это:

var index = peoples.findIndex(p => p.attr1 == "john")

(старый) функциональный подход

TL; DR

Если вы ищете index, где peoples[index].attr1 == "john" используют:

var index = peoples.map(function(o) { return o.attr1; }).indexOf("john");

Объяснение

Шаг 1

Используйте .map() , чтобы получить массив значений, заданных определенным ключом:

var values = object_array.map(function(o) { return o.your_key; });

Вышеприведенная строка выводит вас здесь:

var peoples = [
  { "attr1": "bob", "attr2": "pizza" },
  { "attr1": "john", "attr2": "sushi" },
  { "attr1": "larry", "attr2": "hummus" }
];

К здесь:

var values = [ "bob", "john", "larry" ];

Шаг 2

Теперь мы просто используем .indexOf() , чтобы найти индекс желаемого ключа (что, конечно, также индекс объекта, который мы ищем):

var index = values.indexOf(your_value);

Решение

Мы комбинируем все вышеперечисленное:

var index = peoples.map(function(o) { return o.attr1; }).indexOf("john");

Или, если вы предпочитаете синтаксис ES6:

var index = peoples.map((o) => o.attr1).indexOf("john");

Демонстрация:

var peoples = [
  { "attr1": "bob", "attr2": "pizza" },
  { "attr1": "john", "attr2": "sushi" },
  { "attr1": "larry", "attr2": "hummus" }
];

var index = peoples.map(function(o) { return o.attr1; }).indexOf("john");
console.log("index of 'john': " + index);

var index = peoples.map((o) => o.attr1).indexOf("larry");
console.log("index of 'larry': " + index);

var index = peoples.map(function(o) { return o.attr1; }).indexOf("fred");
console.log("index of 'fred': " + index);

var index = peoples.map((o) => o.attr2).indexOf("pizza");
console.log("index of 'pizza' in 'attr2': " + index);

62
ответ дан jcuenod 25 August 2018 в 19:08
поделиться
function getIndexByAttribute(list, attr, val){
    var result = null;
    $.each(list, function(index, item){
        if(item[attr].toString() == val.toString()){
           result = index;
           return false;     // breaks the $.each() loop
        }
    });
    return result;
}
3
ответ дан Alain BECKER 25 August 2018 в 19:08
поделиться

Если вы хотите проверить сам объект, не мешая прототипу, используйте hasOwnProperty() :

var getIndexIfObjWithOwnAttr = function(array, attr, value) {
    for(var i = 0; i < array.length; i++) {
        if(array[i].hasOwnProperty(attr) && array[i][attr] === value) {
            return i;
        }
    }
    return -1;
}

, чтобы включить атрибуты прототипа, используйте:

var getIndexIfObjWithAttr = function(array, attr, value) {
    for(var i = 0; i < array.length; i++) {
        if(array[i][attr] === value) {
            return i;
        }
    }
    return -1;
}
19
ответ дан Community 25 August 2018 в 19:08
поделиться

Сделайте так: -

var peoples = [
  { "name": "bob", "dinner": "pizza" },
  { "name": "john", "dinner": "sushi" },
  { "name": "larry", "dinner": "hummus" }
];

$.each(peoples, function(i, val) {
    $.each(val, function(key, name) {
        if (name === "john")
            alert(key + " : " + name);
    });
});

OUTPUT:

name : john

См. LIVE DEMO

0
ответ дан Siva Charan 25 August 2018 в 19:08
поделиться

Использование jQuery .each ()

$.each(peoples, function(index, obj) {
   $.each(obj, function(attr, value) {
      console.log( attr + ' == ' + value );
   });
});

Рабочий образец

Использование для цикла :

for(var i = 0; i < peoples.length; i++) {
   for(var key in peoples[i] ) {
      console.log( key + ' == ' +  peoples[i][key]);
   }
}

Рабочий образец

7
ответ дан thecodeparadox 25 August 2018 в 19:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: