未捕获的TypeError:对象

时间:2012-07-04 09:14:24

标签: javascript typeerror

我想搜索两个项目(name = string和location = json)。这个搜索是(一个输入框和两个用于搜索的列)。 目前这个代码我可以找到'名字',但我需要找到位置。

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

我建议但不起作用的代码是:

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

错误是:

  

Uncaught TypeError:Object 123 Street,xxx,xx,Canada,123rd Street,xxx,xx,123 xxx,12345 xxx,France没有方法'toLowerCase'FilterController.showFilteredSet(匿名函数)

2 个答案:

答案 0 :(得分:0)

正如您所说location=json,实际上searchArray[i]['location']是一个对象而不是字符串。您需要根据对象的内容进行搜索。

或者只是将对象更改为字符串格式,如下所示:

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

答案 1 :(得分:0)

JSON.stringify()没问题。但是也会在对象键中搜索。

这意味着:
如果您的“JSON”对象如下所示:

({
  street: 'my street',
  country: 'Texas'
})
即使“数据”不包含结果,

JSON.stringify(obj).toLowerCase().search('country')也会找到结果。

代替:
使用通用方法对对象进行平面搜索。

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

在你的情况下会拒绝:

//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;
   }
}

请注意,此代码修改了对象原型,为所有对象添加了“搜索”功能(这可能与其他库有冲突,您可能会也可能不会使用,想要这样做相同)。