如何在另一个数组中过滤数组

时间:2017-10-25 17:28:44

标签: javascript arrays rxjs observable

假设我有一个这样的数组:

[
  {
    name:"1",
    args: [1,2,3,4,5]
  },
  {
    name:"2",
    args: [2,3,4,5,6]
  }
]

我想要做的是删除所有具有值

[
  {
    name:"1",
    args: [4,5]
  },
  {
    name:"2",
    args: [4,5,6]
  }
]

我如何使用Observables(Rxjs)来做到这一点。我尝试使用mergeMap,但似乎确实做了我想做的事。

3 个答案:

答案 0 :(得分:3)

使用普通的JS,你可以很容易地做到这一点。



var data = [
  {
    name:"1",
    args: [1,2,3,4,5]
  },
  {
    name:"2",
    args: [2,3,4,5,6]
  }
];

var parsedData = data.map(function(el){
    el.args = el.args.filter(function(x){ return x >= 4; });
    return el;
});

console.log(parsedData);




答案 1 :(得分:1)

如果你想要RxJS-way解决方案,它可能看起来像这样:

ES6语法:

const arr = [
  {
    name:"1",
    args: [1,2,3,4,5]
  },
  {
    name:"2",
    args: [2,3,4,5,6]
  }
]

Rx.Observable
  .from(arr) // 1
  .map(item => { // 2
    return {
      ...item,
      args: item.args.filter(arg => arg >= 4) // 3
    }
  })
  .reduce((acc, value) => [...acc, value], []) // 4
  .subscribe(result => {
    console.log(result) // 5
  })

ES5语法:

var arr = [
  {
    name:"1",
    args: [1,2,3,4,5]
  },
  {
    name:"2",
    args: [2,3,4,5,6]
  }
]

Rx.Observable
  .from(arr)
  .map(function(item) {
    return {
        name: item.name,
        args: item.args.filter(function(arg) {
        return arg >= 4
      })
    }
  })
  .reduce(function(acc, value) {
    return [].concat(acc, value)
  }, [])
  .subscribe(function(result) {
    console.log(result)
  })
  1. 从数组
  2. 创建Observable序列
  3. 根据您的需要修改数组中的每个流式项目
  4. 实际args过滤
  5. 将所有流式结果减少为一个数组(如果需要,可以删除此行,然后逐个处理每个数组项目,而不是整个数组)
  6. 用结果做点什么
  7. 一些有用的链接:

答案 2 :(得分:0)

observable用于随时间对数据流进行操作,因此它们是数组,但它们不是数组。如果此数据来自可观察数据,则应该使用map,然后在可观察地图中使用普通数组运算符,因为您只是在操作流中的单个数据点:

source.map(data => data.map(d => Object.assign(d, {args:d.args.filter(v => v >= 4)})));