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

时间:2020-04-05 20:43:04

标签: javascript reactjs

我有一个函数,该函数接受一个对象作为道具,并需要使用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]);
  }
}

有关如何向对象添加多个数组的任何帮助吗?

编辑#1:我要向其中添加项目的existingLinks或对象的示例数据

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 个答案:

答案 0 :(得分:1)

一些自称最佳实践:

  1. 在不需要索引时尽可能避免for循环。 (请参见forEach等)。这样可以减少污染眼睛的变量。
  2. 尽早“继续”或“返回”以避免嵌套内容(例如,return links首先出现)
  3. 尝试最大程度地减少变量的范围。这也可以通过使用forEach
  4. 实现

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()))

答案 1 :(得分:0)

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

由于我看不到linkLineItems需要成为对象的任何原因,因此建议您通过使用let linkLineItems = [];对其进行初始化来使其成为数组。