rxjs-在可观测值中迭代

rxjs-在可观测值中迭代,rxjs,rxjs5,angular2-observables,rxjs-lettable-operators,Rxjs,Rxjs5,Angular2 Observables,Rxjs Lettable Operators,每次生成一个新值时,我都需要将其与所有以前的值进行比较,并且只有当满足条件时,才会将其添加到流中 这是一个例子,可能有点复杂,它应该做一些类似于你正在寻找的东西 import {Observable} from 'rxjs'; const values = ['aa', 'ab', 'ac', 'ba', 'db', 'bc', 'cc', 'cb', 'cc'] Observable.from(values) // accumulate all previous values into a

每次生成一个新值时,我都需要将其与所有以前的值进行比较,并且只有当满足条件时,才会将其添加到流中


这是一个例子,可能有点复杂,它应该做一些类似于你正在寻找的东西

import {Observable} from 'rxjs';

const values = ['aa', 'ab', 'ac', 'ba', 'db', 'bc', 'cc', 'cb', 'cc']

Observable.from(values)
// accumulate all previous values into an array of strings
.scan((previousValues, thisValue) => {
    previousValues.push(thisValue)
    return previousValues
}, [])
// create an object with the previous objects and the last one
.map(previousValues => {
    const lastValue = previousValues[previousValues.length - 1]
    return {previousValues, lastValue}
})
// filters the ones to emit based on some similarity logic
.filter(data => isNotSimilar(data.lastValue, data.previousValues))
// creates a new stream of events emitting only the values which passed the filter
.mergeMap(data => Observable.of(data.lastValue))
.subscribe(
    value => console.log(value)
)

function isNotSimilar(value: string, otherValues: Array<string>) {
    const otherValuesButNotLast = otherValues.slice(0, otherValues.length - 1);
    const aSimilar = otherValuesButNotLast.find(otherValue => otherValue[0] === value[0]);
    return aSimilar === undefined;
}
从'rxjs'导入{Observable};
常量值=['aa','ab','ac','ba','db','bc','cc','cb','cc']
可观察。来自(值)
//将以前的所有值累加到字符串数组中
.scan((以前的值,此值)=>{
previousValues.push(此值)
返回以前的值
}, [])
//使用上一个对象和最后一个对象创建一个对象
.map(以前的值=>{
const lastValue=previousValues[previousValues.length-1]
返回{previousValues,lastValue}
})
//根据某些相似性逻辑过滤要发射的
.filter(数据=>IsNotSimular(data.lastValue、data.previousValues))
//创建一个新的事件流,只发送通过筛选器的值
.mergeMap(data=>Observable.of(data.lastValue))
.订阅(
value=>console.log(值)
)
函数不相似(值:字符串,其他值:数组){
const otherValuesButNotLast=otherValues.slice(0,otherValues.length-1);
const aSimilar=otherValuesButNotLast.find(otherValue=>otherValue[0]==value[0]);
返回aSimilar==未定义;
}

您需要执行哪种类型的比较?例如,如果要检查该值是否为以前从未发出过的新值,则可以使用运算符
distinct
。如果您提供更多详细信息,也许我们可以帮助您更多。distinct不适用。值是字符串,比较函数是相似性