Javascript 如何在函数返回中向对象添加多个数组?

Javascript 如何在函数返回中向对象添加多个数组?,javascript,reactjs,Javascript,Reactjs,我有一个函数,将对象作为道具,需要使用for循环向其添加数组。我的问题是,它只在调用单个数组时才起作用。如果要添加多个数组,我会收到错误linkLineItems.push不是一个函数,但我认为可以使用.push将数组添加到对象 以下是函数: function PrepareSuccessorActivityLinkData(data, existingLinks, linkSetter) { for (let [key, value] of Object.entries(data)) {

我有一个函数,将对象作为道具,需要使用
for
循环向其添加数组。我的问题是,它只在调用单个数组时才起作用。如果要添加多个数组,我会收到错误
linkLineItems.push不是一个函数
,但我认为可以使用
.push
将数组添加到对象

以下是函数:

function PrepareSuccessorActivityLinkData(data, existingLinks, linkSetter) {
  for (let [key, value] of Object.entries(data)) {
    let linkLineItems;
    let linkLineItem;
    if (data.activitiesafter[0] != "DEFAULT") {
      for (var i = 0; i < data.activitiesafter.length; i++) {
        linkLineItem = {
          source: data.itemname,
          target: data.activitiesafter[i],
          type: "activity-activity-after"
        };
        if (!linkLineItems) {
          linkLineItems = linkLineItem;
        } else {
          linkLineItems.push(linkLineItem);
        }
      }
    } else {
      continue;
    }
    return linkSetter(linkData => [...existingLinks, linkLineItems]);
  }
}
编辑#2:作为
数据传递到函数中的示例数据

[{
 itemname: "Hello World", 
 itemtype: "activity", 
 activitiesafter: ["Do Stuff", "Do Other Stuff"]
}]


推送功能仅适用于数组,而不适用于对象


由于我看不出有任何理由
linkLineItems
需要成为一个对象,我建议您通过使用
let linkLineItems=[]初始化它,将其设置为一个数组

一些自封的最佳实践:

  • 在不需要索引时,尽可能避免循环。(参见和类似内容)。这样可以减少污染眼睛的变量
  • 提前“继续”或“返回”以避免嵌套内容(例如
    返回链接
    优先)
  • 尽量减少变量的最大范围。这也是通过使用forEach实现的
  • 函数名toolong(数据、现有链接、链接设置器){
    const moreLinks=data.reduce((链接,项目)=>{
    if(项目活动[0]=“默认值”){
    返回链接
    }
    item.activitiesafter.forEach(活动=>{
    links.push({
    来源:item.itemname,
    目标:活动,
    类型:“活动之后的活动”
    })
    })
    返回链接
    }, [])
    返回linkSetter(=>existingLinks.concat(moreLinks))
    }
    名图隆([{
    项目名称:“你好,世界”,
    itemtype:“活动”,
    活动之后:[“做事情”,“做其他事情”]
    },{
    itemname:“应该忽略”,
    itemtype:“活动”,
    activitiesafter:[“默认”,“无任何内容”]
    
    }],['toto'],(fn)=>console.log('newlinks:',fn())
    您不能推送到对象上。改为设置属性
    linkLineItems.something=[]
    push
    只能在数组上使用。如果您添加一些示例输入/输出数据,这将非常有用。要准确地说出你想要的行为有点困难here@schu34我添加了示例数据。该函数需要能够一次添加多个数组(基于
    for
    循环的
    之后的活动。@usernick我不是在讨论您的问题,我是说调用linkSetter等不是您遇到的问题。您遇到的困难只是根据作为参数传递的数据构建linkLineItems。所有上下文都没有那么有用。这两件事很重要(我们遗漏的)是数据的内容(如果需要是console.log(JSON.stringify(data))以及应显示的预期linkLineItemsconstructed@grodzi我在主帖子中添加了edit#2以显示传递到函数中的
    数据
    ,我对原始帖子进行了一些更新以提供更多上下文,但使用
    []初始化数组
    似乎不会产生向父对象添加多个数组所需的结果。这太棒了,我不知道
    flatMap
    。但是,我得到了错误
    data。在将函数插入我的应用程序时,flatMap不是一个函数。这很奇怪,因为我可以
    console.log(数据)
    ,将其作为变量存储在控制台中,然后使用
    数据。flatMap
    在控制台中工作。有什么想法吗?回答我上次评论中的问题。如果我通过在
    []
    中包装
    数据来实例化数组,它就可以工作了。因此,函数以
    const moreLinks=[data]。flatMap(项=>{
    @userNick如果数据不是数组(在您的实际工作案例中),那么您不需要迭代数据,只需处理普通对象即可!
    [{
     itemname: "Hello World", 
     itemtype: "activity", 
     activitiesafter: ["Do Stuff", "Do Other Stuff"]
    }]