在Javascript中重新组织对象数组:";未捕获类型错误:无法读取属性';推动';“未定义”的定义;
我有一个对象数组,每个对象都将一个条目id与一个标记id配对。我正在尝试重新组织它,以便为每个唯一的在Javascript中重新组织对象数组:";未捕获类型错误:无法读取属性';推动';“未定义”的定义;,javascript,arrays,object,Javascript,Arrays,Object,我有一个对象数组,每个对象都将一个条目id与一个标记id配对。我正在尝试重新组织它,以便为每个唯一的entry\u id获取一个对象,该对象具有一个对应的关联标记列表 更改此选项: tags_entries = [ {'entry_id': 1, 'tag_id': 1}, {'entry_id': 1, 'tag_id': 2}, {'entry_id': 2, 'tag_id': 1}, {'entry_id':
entry\u id
获取一个对象,该对象具有一个对应的关联标记列表
更改此选项:
tags_entries = [
{'entry_id': 1, 'tag_id': 1},
{'entry_id': 1, 'tag_id': 2},
{'entry_id': 2, 'tag_id': 1},
{'entry_id': 2, 'tag_id': 3},
{'entry_id': 3, 'tag_id': 1}
]
entries = {
1:
{
'tags': [1, 2]
},
2:
{
'tags': [1, 3]
},
3:
{
'tags': [1]
}
}
对此:
tags_entries = [
{'entry_id': 1, 'tag_id': 1},
{'entry_id': 1, 'tag_id': 2},
{'entry_id': 2, 'tag_id': 1},
{'entry_id': 2, 'tag_id': 3},
{'entry_id': 3, 'tag_id': 1}
]
entries = {
1:
{
'tags': [1, 2]
},
2:
{
'tags': [1, 3]
},
3:
{
'tags': [1]
}
}
到目前为止,我使用的函数如下所示,但我得到了一个错误:uncaughttypeerror:无法读取未定义的
的属性“push”,该属性来自else
function collect_tags(tags_entries) {
out = {};
for (i=0; i<tags_entries.length;i++)
{
out[tags_entries[i]['entry_id']] = {};
if (!out.hasOwnProperty(tags_entries[i]['entry_id']))
{
out[tags_entries[i]['entry_id']]['tags'] = [];
out[tags_entries[i]['entry_id']]['tags'] = tags_entries[i]['tag_id'];
}
else
{
out[tags_entries[i]['entry_id']]['tags'].push(tags_entries[i]['tag_id']);
}
}
return out;
}
函数收集标签(标签项){
out={};
对于(i=0;i所以在每次迭代中,使用以下行:
out[tags_entries[i]['entry_id']] = {};
然后你问,out
是否有一个属性tags\u entries[i]['entry\u id']
当然了,你刚刚创建了它,它是一个空对象
然后访问此空对象的标记
属性并获取未定义
。然后尝试调用未定义的推送
方法并获取错误
作为替代,如果您不需要支持旧版本的IE,我建议使用功能性样式替换整个IE
或者,如果您只是想修复代码,可能:
用out[tags\u entries[i]['entry\u id']['tags']替换您的if条件。
将此奇怪的双assignmenet替换为同一地址
out[tags\u entries[i]['entry\u id']['tags']=[];
out[tags\u entries[i]['entry\u id']]['tags']=tags\u entries[i]['tag\u id'];
只需要创建数组
out[tags_entries[i]['entry_id']]['tags'] = [];
不要使用其他方法。始终将您的值推送到数组上,即使您必须创建它
这似乎是你想要的:
tags\u条目=[
{'entry\u id':1,'tag\u id':1},
{'entry\u id':1,'tag\u id':2},
{'entry\u id':2,'tag\u id':1},
{'entry\u id':2,'tag\u id':3},
{'entry\u id':3,'tag\u id':1}
]
条目={}
tags_entries.forEach(函数(e){
(条目[如条目编号]||
(条目[e.entry_id]={tags:[]}).tags.push(e.tag_id);
});
document.write(JSON.stringify(entries));
['tags']
=在else中的对象上未定义。您没有将整个对象复制到out[#]
。因此在循环的第一行中发生这种情况out[1]={}
。仅此而已。函数组合(键){返回函数reduceToIndex(acum,x,i){if(!acum[x[key]]]{acum][x[key]]=[];}acum[x[key]].push(x.tag\u id);return acum};}var entries=tags\u entries.reduce(组合使用(“entry\u id”),{})