在Javascript中按功能优化组

时间:2017-06-27 11:30:13

标签: javascript arrays group-by

我一直在寻找一种通过字段对对象数组进行分组的方法。

我在这个答案的评论中找到了一个非常有用的答案(来自@tomitrescak:https://stackoverflow.com/a/34890276/7652464

function groupByArray(xs, key) { 
return xs.reduce(function (rv, x) { 
    let v = key instanceof Function ? key(x) : x[key]; 
    let el = rv.find((r) => r && r.key === v); 
    if (el) { 
        el.values.push(x); 
    } 
    else { 
        rv.push({ key: v, values: [x] }); 
    } 
    return rv; }, []);

}

可以使用以下

console.log(groupByArray(myArray, 'type'); 

此函数工作正常,但是,我的数组包含具有嵌入字段的对象。

我想使用以下功能

console.log(groupByArray(myArray, 'fullmessage.something.somethingelse');

我已经有了一个用于提取有效的嵌入字段的函数。

function fetchFromObject(obj, prop) {

if(typeof obj === 'undefined') {
    return '';
}

var _index = prop.indexOf('.')
if(_index > -1) {
    return fetchFromObject(obj[prop.substring(0, _index)], prop.substr(_index + 1));
}

return obj[prop];

}

可以使用以下

var obj = { obj2 = { var1 = 2, var2 = 2}};

console.log(fetchFromObject(obj, 'obj2.var2')); //2

有人可以帮助我将我的功能实现到群组功能中。

2 个答案:

答案 0 :(得分:1)

您可以更改

"chromium-args": "--memory-pressure-off"

let v = key instanceof Function ? key(x) : x[key];

用于获取任意嵌套键的值。

答案 1 :(得分:0)

function groupBy(arr,props){
 var props=props.split(".");
 var result=[];
 main:for(var i=0;i<arr.length;i++){
  var value=arr[i];
  for(var j=0;j<props.length;j++){
    value=value[props[j]];
    if(!value) continue main;
  }
  result.push(value);
 }
return result;
}

USECASE:

groupBy({a:{b:2}},{a:{b:undefined}},{a:{b:3}},"a.b")//returns [2,3]