【问题标题】:Return specific value with filter使用过滤器返回特定值
【发布时间】:2015-12-03 14:21:53
【问题描述】:

假设你有一个对象数组:

var arr = [{ a: 1 }, { a: 2 }, { a: 3 }];

而您只需要每个对象的 a 属性的值:

[1, 2, 3]

您可以使用什么功能性方法?我尝试使用过滤器:

arr.filter(x => x.a);

当然,filter 会返回整个对象。我可以使用其他任何方法来实现上述结果吗?我的意思是,我想我可以使用forEach,或者使用for循环,但有更好的方法吗?如果我想要所有属性值,map 会起作用,但我实际上想过滤掉其中的一些。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    您希望map 转换每个元素的类型。没有魔术过滤器也可以制作地图;如果你想要filter 和map,那么你需要filter 然后 map。这些东西是专门为链接而构建的:

    var arr = [{ a: 1 }, { a: 2 }, { a: 3 }];
    
    arr.filter(x => x.a > 1).map(x => x.a) // => [2, 3]
    

    【讨论】:

    • 我是新手,如果我的期望是错误的,请见谅。什么更正确,过滤然后映射或映射然后过滤? : - p
    • 这取决于您的具体需求。
    • map() then filter() 通常更简单,因此您的过滤器函数中不需要自定义属性名称。例如:arr.map(pluck, "a").filter(gt, 1)
    • 同样,这取决于您的具体需求。在这种情况下,这无关紧要,因为我们正在处理可能最过度简化的示例。在现实世界中,map/filter 和 filter/map 是完全不同的,通常只能以一种方式工作。例如,如果我要求你返回所有男学生的年龄,你可以做students.filter(s => s.sex === 'male').map(s => s.age),但你不能做students.map(s => s.age).filter(age => ...?),因为filter 的输入将是一个整数。 sex 属性已被剥离。
    • @meagar:我的意思是.filter(Boolean) 或.filter(String) 可以清理单个map() 回调,该回调在转换时真实过滤,从而无需自定义过滤回调。我经常使用这种模式,尽管箭头函数最终已经过时了;)OP询问是否可以一次性过滤+映射,答案是否定的,但是.filter(Boolean)在稀疏的map()结果上几乎是方便。
    【解决方案2】:

    Javascript 是用不同方式获得相同结果的好方法。

    但更好的方法是使用常规 for 循环(检查 Why most JavaScript native functions are slower than their native implementations?)

    所以你可以这样做:

    var arr = [{ a: 1 }, { a: 2 }, { a: 3 }];
    var newArray = [];
    for(var i in arr) { // or you can use: for(var i=0;i<arr.length;i++)
    	var newArrValue = arr[i].a;
    	if(newArrValue<3) // or some other if conditions to filter the values
    	newArray.push(newArrValue);
    }
    console.log(newArray);
    // and you will get [1, 2] as a result with newArrValue<3 if condition

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 2020-03-14
      • 2019-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多