javascript模式匹配对象
给定一个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
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]