Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中重新组织对象数组:";未捕获类型错误:无法读取属性';推动';“未定义”的定义;_Javascript_Arrays_Object - Fatal编程技术网

在Javascript中重新组织对象数组:";未捕获类型错误:无法读取属性';推动';“未定义”的定义;

在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':

我有一个对象数组,每个对象都将一个条目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': 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”),{})