代码之家  ›  专栏  ›  技术社区  ›  Learner

在数组内部展开数组

  •  1
  • Learner  · 技术社区  · 5 年前

    我有一个对象数组,每个对象都有一个名为app is there的属性,我需要用另一个数组进行筛选,如果check数组有相同的app,则筛选并只获取该app。

    我可以得到它,但我的问题是我得到了嵌套数组,我需要得到一个由4个对象组成的单个数组。

    请参阅以下代码。还有没有其他方法可以获得预期的输出。

    let data = [{
      app: "test1",
      key: 1
    }, {
      app: "test2",
      key: 2
    }, {
      app: "test1",
      key: 3
    }, {
      app: "test2",
      key: 3
    }]
    
    let checkArr = ["test1", "test2", "test3"]
    
    let result = checkArr.map(ch => data.filter(da => da.app === ch))
    
    console.log(result)

    预期产量

    [{
        "app": "test1",
        "key": 1
    }, {
        "app": "test1",
        "key": 3
    }, {
        "app": "test2",
        "key": 2
    }, {
        "app": "test2",
        "key": 3
    }]
    
    5 回复  |  直到 5 年前
        1
  •  0
  •   Muhammad Usman    5 年前

    简单使用 .filter 过滤数据对象数组

    let data = [{app: "test1", key: 1}, {app: "test2", key:2}, {app: "test1", key:3}, {app: "test2", key:3}]
    
    let checkArr = ["test1", "test2", "test3"];
    
    
    var arr = data.filter(o => checkArr.indexOf(o.app) > -1);
    
    console.log(arr)
        2
  •  4
  •   Ori Drori    5 年前

    你可以使用 Array.flatMap() (IE/EDGE不支持):

    let data = [{app: "test1", key: 1}, {app: "test2", key:2}, {app: "test1", key:3}, {app: "test2", key:3}]
    
    let checkArr = ["test1", "test2", "test3"]
    
    let result = checkArr.flatMap(ch => data.filter(da => da.app === ch))
    
    console.log(result)

    或被压扁 spreading 进入之内 Array.concat() :

    let data = [{app: "test1", key: 1}, {app: "test2", key:2}, {app: "test1", key:3}, {app: "test2", key:3}]
    
    let checkArr = ["test1", "test2", "test3"]
    
    let result = [].concat(...checkArr.map(ch => data.filter(da => da.app === ch)))
    
    console.log(result)
        3
  •  1
  •   Łukasz Blaszyński    5 年前

    工作方案:

    let data = [{app: "test1", key: 1}, {app: "test2", key:2}, {app: "test1", key:3}, {app: "test2", key:3}]
    
    let checkArr = ["test1", "test2", "test3"]
    
    let result = data.filter(item => {
        return checkArr.indexOf(item.app)!== -1
    })
    
    console.log(result)
    

    小提琴: https://jsfiddle.net/b9vL7ohg/5/

        4
  •  1
  •   shevket    5 年前

    map 你首先在 checkArr 数组 data.filter(...) 所有与该名称匹配的应用程序。

    如果要展平此数组,最清晰的方法是将所有结果与 reduce :

    checkArr
        .map(name => data.filter(d => d.app === name))
        .reduce((a,b) => [...a, ...b]);
    
        5
  •  1
  •   Ian MacDonald    5 年前

    预期的输出似乎不是扁平数组。它似乎是

    console.log(JSON.stringify(data));
    

    要进行筛选,您需要更改谓词:

    data.filter((d) => checkArr.indexOf(d.app) !== -1);
    

    为了使数组变平,我倾向于使用

    data.reduce((a, innerArray) => {
      a.push(...innerArray);
      return a;
    }, []);
    

    这将从一个空数组开始,并递增地向它添加子数组的所有元素。这个 ... 数组上的前缀运算符将其转换为元素的扩展列表,并将其传递给 push 在没有数组包装的情况下插入。