Arrays 如何处理行为对象、观察对象中的嵌套数组/对象?
我通常在使用rxjs和嵌套对象或数组时遇到问题。 我当前的用例是:Arrays 如何处理行为对象、观察对象中的嵌套数组/对象?,arrays,angular,rxjs,Arrays,Angular,Rxjs,我通常在使用rxjs和嵌套对象或数组时遇到问题。 我当前的用例是: {a: [ {b: 0, c:[{d:1}]}, {b: 1, e:[{f: 'someString'}]} ] 任务:获取并设置a、b、c、d、e、f的可观察值。我也希望能够订阅每一个财产 我在一个类似的用例中遇到了这个问题,该用例包含一系列行为子对象: 在rxjs中使用嵌套数组/对象的基本功能时,我通常会遇到问题 我指的基本功能包括: 数组: 按索引获取元素 用于阵列上的of/in 按索引设
{a: [
{b: 0, c:[{d:1}]},
{b: 1, e:[{f: 'someString'}]}
]
任务:获取并设置a、b、c、d、e、f的可观察值。我也希望能够订阅每一个财产
我在一个类似的用例中遇到了这个问题,该用例包含一系列行为子对象:
在rxjs中使用嵌套数组/对象的基本功能时,我通常会遇到问题
我指的基本功能包括:
数组:
- 按索引获取元素
- 用于阵列上的of/in
- 按索引设置元素
- 推动、弹出、移动、切片、拼接
- 通过属性名获取值
- 进入嵌套树:object.key1.key2.key3[3].key4
- 按属性名称设置值
- 分配
- 对于of/in循环
- 解构:例如:
let[variable1,variable2]=someObject代码>
- 也许我忘了别的东西李>
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、pulk等。。。在我的例子中,函数并没有直接表示可以得到可观察的,比如说“e”。制作类似object.a[1].e的东西来实现(至少我还不知道如何实现)
编辑:
我还想指出的是,我仍然喜欢rxjs的想法,它在angular中运行良好。我只是在全面使用它时遇到了一些问题,因为我对angular和rxjs有点陌生 I thin RX主要关注于处理异步操作。数组和对象的变异如果没有现有的操作符,我们可以很好地使用javascript自带的方法。或者你可以为变异/迭代等创建自己的操作符 我将尝试回答您关于数组/对象突变的一些问题,它们实际上非常直截了当 数组: 按索引获取元素
map(arr=>arr[index])
tap(arr=>arr[index]=somevalue)
用于阵列上的of/in
映射(arr=>arry.map(item=>
按索引设置元素
map(arr=>arr[index])
tap(arr=>arr[index]=somevalue)
对象:
通过属性名获取值
pluck('name')
进入嵌套树:object.key1.key2.key3[3].key4
pluck('key1','key2')
按属性名称设置值
映射(obj=>({a:value,obj…}))
分配
假设您真的想要一些拾取数组索引方法作为rxjs操作符,您可以在操作中创建类似于for..的内容
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(pulk('key1').pipe(map(arr=>arr[index]);
但是,pulk返回的东西没有.pipe()或.map()函数,即使key1是一个BehaviorSubject。对象如下:data=new BehaviorSubject({a:new BehaviorSubject([{key2:someValue}]));
Yes操作符只在管道中工作。如果需要选择复杂对象,我建议使用map(obj=>..),Pulk只是属性选择的一个简单助手。如果您返回一个可观察对象,则使用mergemapAh,这样它就会这样做:data.pipe(map(object=>object[key1][index]);