为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

绝地无双 2022-06-16 15:11:45
for我有一个函数,它接受一个对象作为道具,需要使用循环向它添加数组。我的问题是,它仅在调用时添加单个数组时才有效。如果要添加多个数组,我会收到错误linkLineItems.push is not a function,但我认为.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]);  }}有关如何将多个数组添加到对象的任何帮助?existingLinks编辑#1:我尝试向其中添加项目的 or 对象的示例数据var linksData = [ {"source": "Do Something", "target": "My Document", "type": "Activity Output"}, {"source": "My Document", "target": "Operator", "type": "Object Responsible"}, {"source": "Operator", "target": "Do Something", "type": "Role Activity"}];编辑#2:传递给函数的样本数据为data[{ itemname: "Hello World",  itemtype: "activity",  activitiesafter: ["Do Stuff", "Do Other Stuff"]}]
查看完整描述

2 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

一些自称的最佳实践:

  1. 当您不需要索引时,尽可能避免使用 for 循环。(参见forEach等)。这样可以减少污染眼睛的变量。

  2. 尽早“继续”或“返回”以避免嵌套内容(例如return links先出现)

  3. 尽量减少变量的范围。这也是通过使用 forEach 来实现的

function nameTooLong(data, existingLinks, linkSetter) {

  const moreLinks = data.reduce((links, item) => {

    if (item.activitiesafter[0] === "DEFAULT") {

      return links

    }

    item.activitiesafter.forEach(activity => {

      links.push({

        source: item.itemname,

        target: activity,

        type: "activity-activity-after"

      })

    })

    return links

  }, [])

  return linkSetter(_ => existingLinks.concat(moreLinks))

}


nameTooLong([{

 itemname: "Hello World", 

 itemtype: "activity", 

 activitiesafter: ["Do Stuff", "Do Other Stuff"]

},{

 itemname: "shold be ignored", 

 itemtype: "activity", 

 activitiesafter: ["DEFAULT", "nothing there"]

}], ['toto'], (fn) => console.log('newlinks: ', fn()))


如果您阅读 3.,我们可以做得更好,甚至可以避免使用flatMap操作变量链接


function nameTooLong(data, existingLinks, linkSetter) {

  const moreLinks = data.flatMap(item => {

    if (item.activitiesafter[0] === "DEFAULT") {

      return []

    }

    return item.activitiesafter.map(activity => ({

      source: item.itemname,

      target: activity,

      type: "activity-activity-after"

    }))

  })

  return linkSetter(_ => existingLinks.concat(moreLinks))

}


nameTooLong([{

 itemname: "Hello World", 

 itemtype: "activity", 

 activitiesafter: ["Do Stuff", "Do Other Stuff"]

},{

 itemname: "shold be ignored", 

 itemtype: "activity", 

 activitiesafter: ["DEFAULT", "nothing there"]

}], ['toto'], (fn) => console.log('newlinks: ', fn()))


查看完整回答
反对 回复 2022-06-16
?
交互式爱情

TA贡献1712条经验 获得超3个赞

push 函数仅适用于数组,不适用于对象。

而且由于我认为没有任何理由linkLineItems需要成为一个对象,我建议您只需通过初始化它来使其成为一个数组let linkLineItems = [];


查看完整回答
反对 回复 2022-06-16
  • 2 回答
  • 0 关注
  • 174 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号