javascript模式匹配对象

javascript模式匹配对象,javascript,Javascript,给定一个javascript对象数组,例如 let objArray = [{a: 1, b: 2 , c:3},{a: 1, b:3, c:2},{a: 2, b:5, c:1}] 是否有一种更快的方法可以从满足特定条件(如a=1)的每个对象获取所有b值,以返回类似的值 b_consolidated = [2,3] 您可以使用函数获取您的条件项,然后使用仅获取b属性,而不是循环遍历数组中的每个对象 让objArray=[{a:1,b:2,c:3},{a:1,b:3,c:2},{a:2,b

给定一个javascript对象数组,例如

let objArray = [{a: 1, b: 2 , c:3},{a: 1, b:3, c:2},{a: 2, b:5, c:1}]
是否有一种更快的方法可以从满足特定条件(如a=1)的每个对象获取所有b值,以返回类似的值

b_consolidated = [2,3]
您可以使用函数获取您的条件项,然后使用仅获取
b
属性,而不是循环遍历数组中的每个对象

让objArray=[{a:1,b:2,c:3},{a:1,b:3,c:2},{a:2,b:5,c:1}];
让value=objArray.filter(item=>item.a==1).map(item=>item.b);

console.log(值)如果使用以下命令,则只需在数组上迭代一次:

let objArray=[{a:1,b:2,c:3},{a:1,b:3,c:2},{a:2,b:5,c:1}]
让结果=objArray.reduce((arr,val)=>{
如果(val.a==1)
arr.push(val.b);
返回arr;
}, []);
控制台日志(结果)

  • 返回与条件匹配的数组值
  • 通过从提供的列表中的所有对象中提取相同的命名属性,返回新列表
编辑1:

在Ramda中使用所述
reduce
模式的示例:

R.reduce((acc, x) => R.ifElse(
  R.propEq('a', 1), 
  (item) => R.pipe(R.prop('b'), R.append(R.__, acc))(item), 
  R.always(acc)
)(x), [])(objArray)

// [2, 3]

更快捷的方法是使用

您可以在单个循环中使用

let数组=[{a:1,b:2,c:3},{a:1,b:3,c:2},{a:2,b:5,c:1}],
结果=数组.reduce((r,o)=>o.a==1?r.concat(o.b):r,[]);

控制台日志(结果)
objArray.filter(x=>x.a==1).map(x=>x.b)
这是否意味着您正在寻找比O(n)更快的解决方案?或者您只是想阻止对象属性的迭代问题的说明:您仍然使用
过滤器
映射
隐式地遍历每个对象。我认为解决这个问题的方法不可能在某一点上不涉及循环。甚至循环两次。为什么?仅用于返回项目?当您要筛选数组时,将使用筛选器。这里要做的是迭代数组的所有值,然后只使用某些值。一个
forEach
是正确的。因此,在一个OP要求快速代码的问题中,您是:1:加载一个新库。2:迭代数组(至少)两次…如果您关心性能,这种
concat
方法是@Cerbrus,对于真正快速的版本,我将使用for循环,而不是一些数组原型进行迭代。使用
=
而不是
=
R.reduce((acc, x) => R.ifElse(
  R.propEq('a', 1), 
  (item) => R.pipe(R.prop('b'), R.append(R.__, acc))(item), 
  R.always(acc)
)(x), [])(objArray)

// [2, 3]
let objArray = [{a: 1, b: 2 , c:3},{a: 1, b:3, c:2},{a: 2, b:5, c:1}];

objArray.reduce(function(res,obj){
   if(obj.a===1)
     res.push(obj.b);
   return res;
},[]);

// [2,3]