Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何处理行为对象、观察对象中的嵌套数组/对象?_Arrays_Angular_Rxjs - Fatal编程技术网

Arrays 如何处理行为对象、观察对象中的嵌套数组/对象?

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 按索引设

我通常在使用rxjs和嵌套对象或数组时遇到问题。 我当前的用例是:

{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
  • 也许我忘了别的东西
我不知道哪些rxjs对象和哪些有意义(例如,您应该能够直接在可观察对象中设置值)是否可能以及哪些函数可能。但是,在没有rxjs的背景下,我很难正确管理rxjs对象。 我想原因除了我缺乏知识和理解之外是

a。rxjs对象不提供我在普通数组和对象中使用过的功能。e、 g:

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]);