2016-12-11 63 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」。但是,即使「Lui」不存在,我的程序仍會說「找到」。希望有人能告訴我我做錯了什麼。先謝謝你。

+1

'nombre' vs'name'。 – Siguza

+0

@Siguza我只是更新,但仍然不起作用 – progx

+1

還有'break'一旦找到,或者你會保持匹配。 – 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"; 
    } 
} 
} 

問題:如果刪除else語句時,UI將不會被更新時找不到名稱。

+1

['.some()'](https://developer.mozilla .org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some)也可以在這種情況下使用,並且目前有更多的瀏覽器支持。 –

1

你不工作。這幾個問題可能是:

  1. 您使用​​代替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. 您鍵入大號myFunction被調用,其中userInput="L"它不滿足if聲明,因此沒有任何反應。
  2. 您鍵入u,myFunction被調用,其中userInput="Lu"它不滿足if語句,因此沒有任何反應。
  3. 您鍵入i,myFunction被調用,其中userInput="Lui"它不滿足if語句,因此沒有任何反應。
  4. 您鍵入小號myFunction被調用,其中userInput="Luis"它滿足if聲明,因此Found顯示在info股利。
  5. 刪除s,myFunction被調用,其中userInput="Lui"它不滿足if語句,因此沒有任何反應。

但是等一下,info div呢?在else聲明的情況下,沒有人可以更改info div的innerHTML。因此,由於步驟4,它將繼續顯示Found

您可以使用調試器並設置斷點以獨立進行嘗試。