gpt4 book ai didi

javascript - 如何在 RxJs 中加入两半

转载 作者:行者123 更新时间:2023-11-30 14:59:25 25 4
gpt4 key购买 nike

我有一个这样的流

---ab---ab---a---ba---bab---ab---ab---ab--->

我想要这个。

---ab---ab------ab----ab-ab-ab---ab---ab--->

关键是,我有开始和结束的数据 (JSON),有时数据在流中被切成两半,我想再次加入它们。我该怎么做?

最佳答案

看起来像是扫描运算符(operator)的工作

// substitute appropriate real-world logic
const isProperlyFormed = (x) => x === 'ab'
const isIncomplete = (x) => x[0] === 'a' && x.length === 1
const startsWithEnding = (x) => x[0] === 'b'
const getCorrected = (buffer, x) => buffer.prev + x[0]
const getTail = (buffer, x) => x.slice(1)

const initialBuffer = {
emit: [],
prev: null
}

const result = source
.scan((buffer, x) => {
if (isProperlyFormed(x)) {
buffer = {emit: [x], prev:null}
}
if (isIncomplete(x)) {
buffer = {emit: [], prev:x}
}
if (startsWithEnding(x)) {
const corrected = getCorrected(buffer, x)
const tail = getTail(buffer, x)
if (isProperlyFormed(tail)) {
buffer = {emit: [corrected, tail], prev: null}
} else {
buffer = {emit: [corrected], prev: tail}
}
}
return buffer
}, initialBuffer)
.flatMap(x => x.emit)

工作 CodePen

编辑

查看测试输入流,我认为缺少一个案例,这将打破上面的内容。

我改变了测试

---ab---ab---a---ba---bab---ab---ab---ab--->

---ab---ab---a---ba---bab---aba---b---ab--->

同时精简了算法

const getNextBuffer = (x) => {
const items = x.split(/(ab)/g).filter(y => y) // get valid items plus tail
return {
emit: items.filter(x => x === 'ab'), // emit valid items
save: items.filter(x => x !== 'ab')[0] // save tail
}
}

const initialBuffer = {
emit: [],
save: null
}

const result = source
.scan((buffer, item) => {
const bufferAndItem = (buffer.save ? buffer.save : '') + item
return getNextBuffer(bufferAndItem)
}, initialBuffer)
.flatMap(x => x.emit)

工作示例 CodePen

关于javascript - 如何在 RxJs 中加入两半,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46760480/

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