Error de tipo no detectado: objeto

Quiero buscar dos elementos (nombre = cadena y ubicación = json). esta búsqueda es (un cuadro de entrada y dos columnas para la búsqueda). en este momento con este código puedo encontrar 'nombre' pero también necesito encontrar la ubicación.

if(textToCheck !== '') {                                
            if((searchArray[i]['location']).toLowerCase().search(textToCheck) === -1) {
                display = false;
            }
        }   

el código que sugiero y no funciona es:

if(textToCheck !== '') {                                
            if((searchArray[i]['name']).toLowerCase().search(textToCheck) === -1 || (searchArray[i]['location']).toLowerCase().search(textToCheck) === -1) {
                display = false;
            }
        }   

el error es:

TypeError no detectado: Object 123 Street,xxx,xx,Canada,123rd Street,xxx,xx,123 xxx,12345 xxx,France no tiene método 'toLowerCase' FilterController.showFilteredSet (función anónima)

preguntado el 04 de julio de 12 a las 10:07

intente reemplazar (searchArray[i]['name']) con searchArray[i]['name'] -

¿qué console.log(searchArray[i]['location']); ¿decir? -

2 Respuestas

Como dijiste location=json, Realmente searchArray[i]['location'] es un objeto pero no una cadena. Necesita hacer una búsqueda dependiendo de lo que le guste al objeto.

O simplemente cambie el objeto al formato de cadena como se muestra a continuación:

JSON.stringify(searchArray[i]['location']).toLowerCase().search(textToCheck) === -1

Respondido 04 Jul 12, 10:07

cambiar || a &&. Desea ocultar todos los elementos que no contienen el término de búsqueda en name Y DE no lo contengas en location. - novela

JSON.stringify() está bien. Pero eso busca en las claves de objeto también.

Esto significa:
si su objeto "JSON" se ve así:

({
  street: 'my street',
  country: 'Texas'
})

JSON.stringify(obj).toLowerCase().search('country') encontrará un resultado, incluso si los "datos" no lo contienen.

en lugar:
use una forma generalizada de hacer una búsqueda plana en objetos.

Object.prototype.search = function(subject) {
  for(var k in this) {
    if(this.hasOwnProperty(k) && this[k].toString().toLowerCase().search(subject) !== -1) 
      return true;
  }
  return false;
};

var myObj = ({ foo: 'bar', hello: 'world' });
console.log(myObj.search('ar')); //search for "ar", returns true
console.log(myObj.search('ponyo!')); //search for "ponyo!", returns false
console.log(myObj.search('hello')); //search for "hello", returns false

en su caso, eso se negaría a:

//somewhere above, run this only once:
Object.prototype.search = function(subject) {
  for(var k in this) {
    if(this[k].toString().toLowerCase().search(subject) !== -1) 
      return true;
  }
  return false;
};
/////


if(textToCheck !== '') {                                
   if((searchArray[i]['name']).toLowerCase().search(textToCheck) === -1 && 
      (searchArray[i]['location']).search(textToCheck) === false) {
         display = false;
   }
}

tenga en cuenta que este código modifica el prototipo de Objeto, agregando una función de "búsqueda" a todos las objetos (esto podría entrar en conflicto con otras bibliotecas, que puede o no estar usando, que quieren hacer lo mismo).

Respondido 04 Jul 12, 11:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.