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

过滤映射并返回ID数组

  •  0
  • Wolf359  · 技术社区  · 6 年前

    我有这样的结构:

    var entities = {
      1: {'name': 'Fred', 'age': 35},
      2: {'name': 'Hans', 'age': 47},
      3: {'name': 'Bert', 'age': 27}
    }
    

    我需要这样的东西:

    var ids = entities.filter( p => p.age > 30);
    

    它应该返回一个数组:

    [1, 2]
    

    有方便的方法吗?例如,火山灰等?

    6 回复  |  直到 6 年前
        1
  •  5
  •   Karim    6 年前

    你可以使用 Object.keys 结合 Array.prototype.filter

    var entities = {
      1: {'name': 'Fred', 'age': 35},
      2: {'name': 'Hans', 'age': 47},
      3: {'name': 'Bert', 'age': 27}
    }
    const result = Object.keys(entities).filter(key =>  entities[key].age > 30);
    console.log(result);
        2
  •  2
  •   Vejsil Hrustić    6 年前

    你可以用罗达什 reduce 方法。它同时适用于数组和对象。 例子:

    var entities = {
      1: {'name': 'Fred', 'age': 35},
      2: {'name': 'Hans', 'age': 47},
      3: {'name': 'Bert', 'age': 27}
    }
    
    var result = _.reduce(entities, (acc, o, key) => {
        if(o.age >= 35) { // add your condition here
           acc.push(key);
         }
        return acc;
    }, []);
    
    console.log(result); // ["1", "2"]
    
        3
  •  2
  •   Christian Vincenzo Traina    6 年前

    filter 只适用于 Array ,但有一些有趣的事情:您的对象看起来像一个数组!

    使用javascript的人会说:

    如果它像鸭子一样走路,像鸭子一样嘎嘎叫,那么它就是鸭子

    关于这个上下文,一些类似数组的东西只是一个以数字作为键的对象。 length 财产。看着你的物体,你就错过了长度属性!

    让我们添加 长度 以这种方式获得的属性:

    entities.length = Math.max(...Object.keys(entities)) + 1; // 4
    

    然后您可以在实际数组中转换类似数组的对象:

    const array = Array.from(entities);
    

    最后,你可以使用 数组 方法,也过滤:

    array
      .filter(p => p.age > 30)
      .map((obj, index) => index);
    
        4
  •  1
  •   Nina Scholz    6 年前

    您可以获取条目、过滤年龄并返回键(显然是字符串)。

    var entities = { 1: {'name': 'Fred', 'age': 35 }, 2: {'name': 'Hans', 'age': 47 }, 3: {'name': 'Bert', 'age': 27 } },
        result = Object
            .entries(entities)
            .filter(({ 1: { age } }) => age > 30)
            .map(([k]) => k);
    
    console.log(result);
        5
  •  1
  •   Code Maniac    6 年前

    您可以循环使用的键 entities 并检查特定钥匙的老化情况 实体 和过滤器。

    var entities = {
      1: {'name': 'Fred', 'age': 35},
      2: {'name': 'Hans', 'age': 47},
      3: {'name': 'Bert', 'age': 27}
    }
    
    let op = Object.keys(entities).filter(e=> entities[e].age > 30)
    
    console.log(op)
        6
  •  0
  •   Osama    6 年前

    使用.map()和.keys()实现如下代码

    var i= -1;
    var keys=_.keys(entities);
    var person= _.map(entities, function(p) {
        i++;
        if (p.age>30) return keys[i];
    });