javascript模式匹配对象

时间:2017-05-15 07:16:37

标签: javascript

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

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

是否有更快的方法从每个对象中获取满足特定条件的所有b值,例如a = 1,以返回类似

的内容
b_consolidated = [2,3]

而不是循环遍历数组中的每个对象?

5 个答案:

答案 0 :(得分:4)

您可以使用 Array#filter 功能获取条件中的项目,然后使用 Array#map 仅获取b属性



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

let values = objArray.filter(item => item.a === 1).map(item => item.b);

console.log(values);




或者您可以在一个循环中执行此操作



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

objArray.forEach(item => {

  if(item.a === 1) {
      values.push(item.b);
  }
  
});

console.log(values);




答案 1 :(得分:3)

您可以在一个循环中使用Array#reduce

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

console.log(result);

带有for循环的最快版本。

let array = [{ a: 1, b: 2, c: 3}, { a: 1, b: 3, c: 2 }, { a: 2, b: 5, c: 1 }],
    i, l,
    result = [];

for (i = 0, l = array.length; i < l; i++) {
    if (array[i].a === 1) {
        result.push(array[i].b);
    }
}

console.log(result);

答案 2 :(得分:1)

如果您使用reduce

,则只需迭代一次数组

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

let result = objArray.reduce((arr, val) => {
  if(val.a === 1)
    arr.push(val.b);
  return arr;
}, []);

console.log(result);
&#13;
&#13;
&#13;

除了手动for循环之外,它的速度和它一样快:

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

let result = [];

for(var i = 0 ; i < objArray.length; i++){
  if(objArray[i].a === 1)
    result.push(objArray[i].b);
}

console.log(result);
&#13;
&#13;
&#13;

Here's a JSPerf来说明差异。
手动for循环是目前最快的。

答案 3 :(得分:1)

使用.reduce

会更快
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]

答案 4 :(得分:-1)

Ramda

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

R.pipe(
  R.filter(R.propEq('a', 1)),
  R.pluck('b')
)(objArray)

// [2, 3]
  • Filter返回条件匹配的数组值。
  • Pluck通过从提供的列表中的所有对象中提取相同的命名属性来返回新列表。

编辑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]