【问题标题】:How do deal with nested Arrays/objects in BehaviorSubjects, Observables?如何处理 BehaviorSubjects、Observables 中的嵌套数组/对象?
【发布时间】:2020-01-07 03:04:05
【问题描述】:

我通常在使用带有嵌套对象或数组的 rxjs 时遇到问题。 我目前的用例是这样的:

{a: [ 
    {b: 0, c:[{d:1}]}, 
    {b: 1, e:[{f: 'someString'}]}
    ]

任务:获取和设置a、b、c、d、e、f的Observable或值。我还希望能够订阅每个属性。

我在一个带有 BehaviorSubjects 数组的类似用例中遇到了这个问题: Efficiently get Observable of an array BehaviorSubjects

在 rxjs 中使用嵌套数组/对象的基本功能时,我通常会遇到问题。

我指的基本功能包括:

数组:

  • 按索引获取元素
  • 在数组上使用 for of/in
  • 按索引设置元素
  • 推送、弹出、移位、切片、拼接……

对象:

  • 按属性名称获取值
  • 进入嵌套树:object.key1.key2.key3[3].key4 ...
  • 按属性名称设置值
  • 分配
  • for of/in 循环

一般:

  • 解构:例如:let [variable1, variable2] = someObject;
  • 也许我忘记了其他东西。

我不知道哪些函数对于哪些 rxjs 对象是可行的,哪些是有意义的(例如,您应该能够直接在 Observable 中设置值)。但是来自没有 rxjs 的背景,我很难正确管理我的 rxjs 对象。 我认为除了我缺乏知识和理解之外的原因是,

一个。 rxjs 对象不提供我习惯的普通数组和对象的功能。例如:

let variable1 = array[1].property;   
//becomes this (see related stack-Question I mentioned earlier)

let variable2 = array.pipe(mergeMap(d=> d[index].pipe(map(d1 => d1[property])); 
// -> what happens here? You first need to know what mergeMap,
// map is doing and you have 5 levels of nested inline functions.  

b.为了实现那些提到的功能,我需要检查 .pipe() 函数并使用一些函数,如 mergeMap、map、pluck ......这些函数并不直接表明你可以获得让我们说'e'的 Observable在我的例子中。使 object.a[1].e 之类的东西难以实现(至少我还不知道该怎么做)

编辑: 我还想指出,我仍然喜欢 rxjs 的想法,它在 Angular 中运行良好。我只是在完全使用它时遇到了问题,因为我对 angular 和 rxjs 有点陌生。

【问题讨论】:

    标签: arrays angular rxjs


    【解决方案1】:

    我瘦RX主要专注于处理异步操作。如果没有现有的运算符,我们可以完美地使用这些方法的数组和对象的突变。或者您可以为突变/迭代等创建自己的运算符。

    将尝试回答您关于数组/对象突变的一些问题,它们实际上非常直截了当。

    数组:

    通过索引获取元素

    map(arr=>arr[index])
    

    在数组上使用 for of/in 地图(arr=>arry.map(item=>....))

    按索引设置元素

    tap(arr=>arr[index]=somevalue)
    

    对象:

    通过属性名获取值

    pluck('name')
    

    进入嵌套树:object.key1.key2.key3[3].key4 ...

    pluck('key1','key2')
    

    按属性名称设置值 地图(obj=>({a:value,obj...})) 分配

    假设你真的想要一些选择数组索引方法作为 rxjs 运算符,你可以创建类似于 for..in 操作的东西。

    const pluckIndex=(index)=>source=>source.pipe(map(arr=>arr[index]))
    const source = of([2,3])
    source.pipe(pluckIndex(1)).subscribe(x => console.log(x));
    

    【讨论】:

    • 两件事:我需要将上述函数包装在 .pipe() 中吗?第二:因此,如果得到 object.key1[index].key2,那么按照你的答案的直观解决方案对我来说是:obsOfObject.pipe(pluck('key1').pipe(map(arr=>arr[index])); 但是 pluck 返回的东西没有 .pipe() 或 .map() 函数,甚至如果 key1 是一个 BehaviorSubject。该对象看起来像这样:data = new BehaviorSubject<object>({a: new BehaviorSubject([{key2: someValue}])});
    • 是的,操作员只在管道中工作。如果你需要选择复杂的对象,我推荐使用 map(obj=>....),pluck 只是一个简单的属性选择助手。如果你返回一个可观察的你使用 mergemap
    • 啊,那它会这样吗?:data.pipe(map(object => object[key1][index]));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多