У меня есть массив JSON, возвращенный через AJAX, который выглядит следующим образом:

"stuff": [["2","66%"], ["3","42%"],...

< Сильный > Проблема Я хочу сопоставить нулевой индекс каждого элемента в этом массиве с переменной вне цикла, и если он совпадает, я хочу вернуть процент рядом с ним.

Я не знаю синтаксис в jQuery для этого. Пожалуйста, посмотрите на мой код ниже и посмотрите, правильно это или нет:

var percentage = 0;
var stuffarr = jsonobj['stuff'];
var stuffID = jsonobj['stuff_id']
if (!stuffID || 0 === stuffID.length){
   $("#stuff-element").html("--");
}
else {
   var percentage = $.each(stuffarr, function (index, value) {
   if(value[0] == stuffID)
      return value[1]   
   });
}
1
omrakhur 31 Авг 2017 в 12:51

3 ответа

Лучший ответ

Во-первых, немного терминологии. У вас есть структура данных, которая содержит несколько свойств. Это не имеет ничего общего с JSON после его десериализации.

Что касается вашей проблемы, то jQuery не требуется, поскольку вы можете использовать find() для поиска элемента в массиве по значению переменной stuffID. Попробуй это:

var obj = {
  "stuff": [
    ["2", "66%"],
    ["3", "42%"]
  ],
  "stuff_id": "3"
}

var percentage = 0;
var stuffArr = obj['stuff'];
var stuffId = obj['stuff_id']

if (!stuffId || 0 === stuffId.length) {
  $("#stuff-element").html("--");
} else {
  percentage = stuffArr.find(function(el) {
    return el[0] == stuffId;
  })[1];
}
  
console.log(percentage);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
2
Rory McCrossan 31 Авг 2017 в 10:08

Оператор return, который вы использовали, возвращает результат функции (..) внутри функции .each (..) и не является возвращаемым значением функции .each (..). допустимое возвращаемое значение - логическое, которое «сообщает» функции .each (..), следует ли продолжать или нет. вместо этого используйте следующий синтаксис:

var ret = '';
$(arr).each(function () {
    var curr = $(this);
    //console.log(curr); 
    if(curr[0] == stuffID){
        //console.log('>>found: ' + curr[1]);
        ret = curr[1];
        //if found -> break loop
        return false; 
    }
});

Комментарий: вы должны рассмотреть вместо использования внутренней структуры данных массива использовать объект, это более «правильная» структура данных:

// "stuff": [{"id":"2","percent":"66%"}, {"id":"3","percent":"42%"},...
var ret = '';
$(arr).each(function () {
    var curr = this;
    //console.log(curr.id); 
    if(curr.id == stuffID){
        //console.log('>>found: ' + curr.percent);
        ret = curr.percent;
        //if found -> break loop
        return false; 
    }
});

Подход @LiverpoolOwen является чистым и приятным, и если вы хотите использовать его в сочетании с объектным подходом, сделайте следующее:

arr.find(function (value) {
if(value.id == stuffID)
   return value;  
}).percent;
0
Snufkin 31 Авг 2017 в 10:33

Попробуй это

var percentage = stuffarr.find(function (value) {
if(value[0] == stuffID)
   return value[1];  
})[1];
1
LiverpoolOwen 31 Авг 2017 в 10:04