2016-12-11 3 views
2

Я работаю над этой простой функцией поиска, которая находит человека в объекте JSON. Вот мой код:Как получить правильное значение от JSON?

var personas = [ 
 
    { 
 
     "name": "Luis", 
 
     "lastname": "Gomez", 
 
     "age": 25 
 
    }, 
 
    { 
 
     "name": "Maria", 
 
     "lastname": "Lopez", 
 
     "age": 20 
 
    }, 
 
    { 
 
     "name": "Lucero", 
 
     "lastname": "Perez", 
 
     "age": 30 
 
    }, 
 
    { 
 
     "name": "Daniel", 
 
     "lastname": "Ruiz", 
 
     "age": 18 
 
    }, 
 
    { 
 
     "name": "Teresa", 
 
     "lastname": "Ponce", 
 
     "age": 23 
 
    } 
 
]; 
 

 
function myFunction(userInput){ 
 

 
    if (userInput.length == 0) { 
 
    document.getElementById("info").innerHTML = ""; 
 

 
    }else{ 
 
    for(var i in personas){ 
 
    if(personas[i].name === userInput){ 
 
     document.getElementById("info").innerHTML = "Found"; 
 
    }else{ 
 
     document.getElementById("info").innerHTML = "Not Found"; 
 
    } 
 
    } 
 
} 
 
}
<form > 
 
Find person: <input type = "text" onkeyup="myFunction(this.value)"/> 
 
</form> 
 

 
<div id = "info"></div>

Мой вопрос: По какой-то причине, если я удалю еще заявление:

else{ 
    document.getElementById("info").innerHTML = "Not Found"; 
} 

Моя программа сможет найти имя человека. Но скажем, я набираю «Luis», а затем удаляю «s», в последней строке будет сказано «Lui». Однако моя программа все равно скажет «Найденный», хотя «Луи» не существует. Надеюсь, кто-то может сказать мне, что я делаю неправильно. Заранее спасибо.

+1

'nombre' vs' name'. – Siguza

+0

@Siguza Я просто обновляю, но все еще не работаю – progx

+1

Также «ломается» когда-то найденный, или вы собираетесь поддерживать соответствие. – Siguza

ответ

0

Вы также можете создать массив с элементами, которые соответствуют и испытания, если результирующий массив пуст:

var personas = [ 
 
    { 
 
     "name": "Luis", 
 
     "lastname": "Gomez", 
 
     "age": 25 
 
    }, 
 
    { 
 
     "name": "Maria", 
 
     "lastname": "Lopez", 
 
     "age": 20 
 
    }, 
 
    { 
 
     "name": "Lucero", 
 
     "lastname": "Perez", 
 
     "age": 30 
 
    }, 
 
    { 
 
     "name": "Daniel", 
 
     "lastname": "Ruiz", 
 
     "age": 18 
 
    }, 
 
    { 
 
     "name": "Teresa", 
 
     "lastname": "Ponce", 
 
     "age": 23 
 
    } 
 
]; 
 
function myFunction(userInput){ 
 
    if (userInput.length == 0) 
 
    document.getElementById("info").innerHTML = ""; 
 
    else { 
 
    if (personas.filter(x => x.name === userInput).length > 0) 
 
     document.getElementById("info").innerHTML = "Found"; 
 
    else 
 
     document.getElementById("info").innerHTML = "Not Found"; 
 
    } 
 
}
<form > 
 
Find person: <input type = "text" onkeyup="myFunction(this.value)"/> 
 
</form> 
 

 
<div id = "info"></div>

1

Вы можете использовать find метод:

function myFunction(userInput){ 

    if (userInput.length == 0) { 
    document.getElementById("info").innerHTML = ""; 
    }else{ 
    var persona = personas.find(function(persona) { 
     return persona.name === userInput; 
    }) 

    if (persona) { 
     document.getElementById("info").innerHTML = "Found"; 
    } else { 
     document.getElementById("info").innerHTML = "Not Found"; 
    } 
} 
} 

Проблема: Если вы удалите оператор еще, интерфейс не будет обновляться, если имя не найдено.

+1

['.some()'] (https: //developer.mozilla .org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some) также можно использовать в этом случае и в настоящее время имеет большую поддержку браузера. –

1

Ваш не работает. Несколько проблема может быть:

  1. вы используете nombre вместо name
  2. Если однажды вы сопрягать name вы должны разорвать петлю.
  3. Проблема, которую вы проиллюстрировали, вероятно, вы использовали событие onkeydown вместо onkeyup, но теперь это выглядит нормально.

работает код здесь:

var personas = [ 
 
    { 
 
     "name": "Luis", 
 
     "lastname": "Gomez", 
 
     "age": 25 
 
    }, 
 
    { 
 
     "name": "Maria", 
 
     "lastname": "Lopez", 
 
     "age": 20 
 
    }, 
 
    { 
 
     "name": "Lucero", 
 
     "lastname": "Perez", 
 
     "age": 30 
 
    }, 
 
    { 
 
     "name": "Daniel", 
 
     "lastname": "Ruiz", 
 
     "age": 18 
 
    }, 
 
    { 
 
     "name": "Teresa", 
 
     "lastname": "Ponce", 
 
     "age": 23 
 
    } 
 
]; 
 

 
function myFunction(userInput){ 
 

 
    if (userInput.length == 0) { 
 
    document.getElementById("info").innerHTML = ""; 
 

 
    }else{ 
 
    for(var i in personas){ 
 
    if(personas[i].name === userInput){ 
 
     document.getElementById("info").innerHTML = "Found"; 
 
     break; 
 
    }else{ 
 
     document.getElementById("info").innerHTML = "Not Found"; 
 
    } 
 
    } 
 
} 
 
}
<form > 
 
Find person: <input type = "text" onkeyup="myFunction(this.value)"/> 
 
</form> 
 

 
<div id = "info"></div>

0

Давайте посмотрим, что происходит, когда вы не пишете else заявление.

  1. Вы набираете L, myFunction называется, где userInput="L" он не удовлетворяет if заявление, следовательно, ничего не происходит.
  2. Вы печатаете u, myFunction, где userInput="Lu" не удовлетворяет заявлению if, поэтому ничего не происходит.
  3. Вы печатаете i, myFunction, где userInput="Lui" не удовлетворяет заявлению if, поэтому ничего не происходит.
  4. Вы набираете s, myFunction называется, где userInput="Luis" удовлетворяет if заявление, следовательно Found отображается в info дел.
  5. Вы удаляете s, myFunction, где userInput="Lui" не удовлетворяет заявлению if, поэтому ничего не происходит.

Но подождите, а как насчет info div? В отсутствие заявления else, некому менять innerHTMLinfo div. Следовательно, он будет продолжать показывать Found из-за шага 4.

Вы можете использовать отладчик и установить контрольные точки, чтобы попробовать самостоятельно.

Смежные вопросы