gpt4 book ai didi

javascript - 如何使用吐出和拼接递归更新数组?

转载 作者:行者123 更新时间:2023-12-03 01:27:19 24 4
gpt4 key购买 nike

我非常感谢您提供一些帮助 - 提前谢谢您!

代码需要执行以下操作:

它需要循环遍历[text]数组。无论在哪里找到 %${extLinks[i].subject}% 都应该用对象替换该文本片段 {subject: extLinks[i].subject, target: extLinks[i] .target} 并将其添加到数组中。

编辑:---此外,仅应替换 subject+target 的第一个实例,而忽略其他实例。

它也必须是可重用的 - 在整个数据库中使用主题+目标的不同组合(大约 700 个链接主题!)---

这是我的情况:

addLinks(synopsis, extLinks = []) {
let text = synopsis
for (let i = 0; i < extLinks.length; i++) {
text = text.replace(extLinks[i].subject, `%${extLinks[i].subject}%`)
}
let items = [text]

extLinks.map(link => {
let arr = []
for (var j = 0; j < items.length; j++) {
console.log(items)
arr = items[j].split(`%${link.subject}%`)
arr.splice(1, 0, {
subject: extLinks[j].subject,
target: extLinks[j].target,
})
items = arr.splice(0)
}
})

console.log({ items })

return [synopsis]
}

预期返回是这样的:

["Striking from a fortress hidden among the billion stars of the ", {"subject": "GALAXY", "target": "https://teara.govt.nz/mi/te-mana-o-te-wahine/page-1"}, ", rebel spaceships have won their first victory in a battle with the powerful Imperial Starfleet.  The ", { "subject": "EMPIRE", "target": "https://teara.govt.nz/mi/te-mana-o-te-wahine"  }, "  fears that another defeat could bring a thousand more solar systems into the rebellion, and Imperial control over the GALAXY would be lost forever. Here's another sentence with EMPIRE in it."]

但是当前的代码返回的是:

["Striking from a fortress hidden among the billion stars of the %GALAXY%, rebel spaceships have won their first victory in a battle with the powerful Imperial Starfleet.  The %EMPIRE% fears that another defeat could bring a thousand more solar systems into the rebellion, and Imperial control over the GALAXY would be lost forever. Here's another sentence with EMPIRE in it."]

所以 - 它没有正确创建最终数组,它与我需要递归更新数组的方式有关。

fyi 我正在使用的数据库对象如下所示:

“内容”:{
...
“概要”:{
...
“长的”:
“叛军宇宙飞船从隐藏在银河系数十亿颗恒星中的堡垒发起进攻,在与强大的帝国星际舰队的战斗中赢得了首场胜利。帝国担心,另一次失败可能会让数千个太阳系卷入叛乱,帝国的控制权也随之消失。银河系上空的信息将永远消失。这是另一个带有帝国的句子。",
...
]
},
“外部链接”: [
{
“主题”:“帝国”,
“目标”:“https://teara.govt.nz/mi/te-mana-o-te-wahine”
},
{
“主题”:“银河”,
“目标”:“https://teara.govt.nz/mi/te-mana-o-te-wahine/page-1”
}
],

最佳答案

这个怎么样?

function injectLinksIntoSynopsis (synopsis = '', links = []) {
const linkDictionary = links.reduce((obj, link) => {
obj[link.subject] = link
return obj
}, {})
const linkMatch = new RegExp(`(${links.map(link => link.subject).join('|')})`, 'g')
return synopsis
.split(linkMatch)
.map(val => {
return linkDictionary[val] || val
})
}

基本上

  1. 将所有链接主题转换为包容性正则表达式 /(GALAXY|EMPIRE)/g。这意味着当您拆分字符串时,您也将获得正则表达式中匹配的值。
  2. 概要拆分为链接值和非链接值数组
  3. 创建链接字典以供查找(比使用索引更干净、更容易阅读)。 {GALAXY:{主题:'GALAXY',目标:'https://teara.govt.nz/mi/te-mana-o-te-wahine/page-1'}}<
  4. 然后映射每个值并返回它或它在字典中的映射值。

这里的工作示例 https://jsfiddle.net/stwilz/9342nzj5/52/

<小时/>

如果您只想替换匹配项的第一个实例,像这样的爵士乐怎么样,

function injectFirstLinkIntoSynopsis (synopsis = '', links = []) {
let stringifiedArray = links.reduce((newSynopsis, link) => {
return newSynopsis.replace(link.subject, `", ${JSON.stringify(link)}, "`)
}, `["${synopsis}"]`)
return JSON.parse(stringifiedArray)
}

我们迭代您的链接,并将其主题的第一个实例替换为字符串化对象。完成后,我们只需 JSON.parse() 将其放回到数组中。

我个人非常喜欢这个解决方案,因为我滥用了 JSON API :)

这里有新的工作示例 https://jsfiddle.net/stwilz/9342nzj5/76/

关于javascript - 如何使用吐出和拼接递归更新数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51470239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com