解析对象时TypeError对象不是函数

问题描述:

我试图根据搜索条件解析下面的值,然后将结果打印到表中。我能够正确解析所需的结果以控制台或将所有结果打印到表格中。以下是我尝试合并这两个函数。我结束了一个类型错误TypeError: obj.list[i].forEach is not a function。从搜索中,我相信这是因为它是一个对象,而不是一个数组,虽然无法正确解析对象。我如何纠正这个问题才能正确解析对象?解析对象时TypeError对象不是函数

var obj = { 
 
    "list": [{ 
 
     "name": "my Name", 
 
     "id": 12, 
 
     "type": "car owner" 
 
    }, 
 
    { 
 
     "name": "my Name", 
 
     "id": 13, 
 
     "type": "car owner2" 
 
    }, 
 
    { 
 
     "name": "my Name4", 
 
     "id": 14, 
 
     "type": "car owner3" 
 
    }, 
 
    { 
 
     "name": "my Name4", 
 
     "id": 15, 
 
     "type": "car owner5" 
 
    } 
 
    ] 
 
}; 
 

 
var tableBody = ""; 
 

 
var columns = []; 
 

 
// Create the header record. 
 
tableBody = tableBody + "<tr>"; 
 
for (var prop in obj.list[0]) { 
 
    if (obj.list[0].hasOwnProperty(prop)) { 
 
    // Append properties such as myid, fname, lname etc. 
 
    tableBody = tableBody + ("<th>" + prop + "</th>"); 
 

 
    // Also keep a list of columns, that can be used later to get column values from the 'data' object. 
 
    columns.push(prop); 
 
    } 
 
} 
 
tableBody = tableBody + "</tr>"; 
 

 
var results = []; 
 
var searchField = "name"; 
 
var searchVal = "my Name"; 
 
for (var i = 0; i < obj.list.length; i++) { 
 
    // search term 
 
    if (obj.list[i][searchField] == searchVal) { 
 
    // Create the data rows. 
 
    // I get an error here: 
 
    obj.list[i].forEach(function(row) { 
 
     // Create a new row in the table for every element in the data array. 
 
     tableBody = tableBody + "<tr>"; 
 

 
     columns.forEach(function(cell) { 
 
     // Cell is the property name of every column. 
 
     // row[cell] gives us the value of that cell. 
 
     tableBody = tableBody + "<td>" + row[cell] + "</td>"; 
 
     }); 
 

 
     tableBody = tableBody + "</tr>"; 
 
    }); 
 
    } 
 
} 
 

 
jQuery("#usersTable").append(tableBody);
<table border='1' id="usersTable"></table>

JSFiddle

Working version based on feedback

+3

'obj.list(我)'应该是'obj.list [I]'。你现在将它作为函数调用,而不是访问属性 – Pevara

+0

我用更正的语法更新了问题。 – Astron

+2

你想用'obj.list [i] .forEach'完成什么? 'obj.list'是对象列表,而不是列表列表。只是'var row = obj.list [i]',也许? – Ryan

forEach是迭代法阵,在提供的代码你试图将此方法应用于对象,这是一个错误的方式。要遍历对象属性,您可以使用for (var key in object) {"code here"}。我已经纠正代码:

var obj = { 
 
    "list": [{ 
 
     "name": "my Name", 
 
     "id": 12, 
 
     "type": "car owner" 
 
    }, 
 
    { 
 
     "name": "my Name", 
 
     "id": 13, 
 
     "type": "car owner2" 
 
    }, 
 
    { 
 
     "name": "my Name4", 
 
     "id": 14, 
 
     "type": "car owner3" 
 
    }, 
 
    { 
 
     "name": "my Name4", 
 
     "id": 15, 
 
     "type": "car owner5" 
 
    } 
 
    ] 
 
}; 
 

 
var tableBody = ""; 
 
var columns = []; 
 
var searchField = "name"; 
 
var searchVal = "my Name"; 
 

 
tableBody = tableBody + "<tr>"; 
 
for (var prop in obj.list[0]) { 
 
    if (obj.list[0].hasOwnProperty(prop)) { 
 
    tableBody = tableBody + ("<th>" + prop + "</th>"); 
 
    columns.push(prop); 
 
    } 
 
} 
 

 
tableBody = tableBody + "</tr>"; 
 

 
for (var i = 0; i < obj.list.length; i++) { 
 
    if (obj.list[i][searchField] == searchVal) { 
 
    tableBody = tableBody + "<tr>"; 
 
    for (var key in obj.list[i]) { 
 
     tableBody = tableBody + "<td>" + obj.list[i][key] + "</td>"; 
 
    }; 
 
    tableBody = tableBody + "</tr>"; 
 
    } 
 
} 
 

 
jQuery("#usersTable").append(tableBody);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<table border='1' id="usersTable"></table>

+0

你测试了你的代码吗?生成一个表格,但单元格未定义,虽然我可能会丢失一些东西。 – Astron

+0

@Astron,我明天再看一遍,现在我需要睡觉;) –

+0

@Astron,我已经更新了答案,查看了一下 –