我有一个函数,该函数接受一个对象作为道具,并需要使用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"]
}]
答案 0 :(得分:1)
一些自称最佳实践:
return links
首先出现)
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 = [];
对其进行初始化来使其成为数组。