将JS集合转换为具有特定键和分组值的对象

时间:2018-03-01 15:58:01

标签: javascript arrays object collections grouping

我想用这些参数创建这个JS函数:

transform([{a:1, b:'1', c:true},{a:'1', b:2, c:3, d:false}, {a:1, c:'test'}], ['a','b','c']);

第一个参数是一个对象数组

第二个是键数组。

我想得到这个输出对象:

{a:[1, '1', 1], b:['1', 2],c:[true, 3, 'test']}

如您所见,第二个参数成为创建对象的键 以及这些键下的所有值组合在一起。

也许可以选择将唯一参数传递给函数并获取它(删除重复值):

{a:[1, '1'], b:['1', 2], c:[true, 3, 'test']} 

快速和/或优雅的方式是什么?

是否有任何lodash /下划线帮助器?

作为一个额外的通才。输入(第一个参数)如何是具有嵌套级别的通用集合(嵌套级别的数组或对象的数组或对象)? 感谢。

4 个答案:

答案 0 :(得分:0)

试试这个:

function transform(data,keys){
  let results = {};
  //loop all you keys
  keys.forEach(index => {
      //loop your arrays
      data.forEach(element => {
          //if there is a match add the key to the results object
          if(index in element) {
             if(!(index in results))  results[index] = [];   
             //check if a value already exists for a given key.    
             if(!(element[index] in results[index]))   results[index].push(element[index]);
          }
      });
  });
  return results;
}

console.log(transform([{a:1,b:'1',c:true},{a:'1',b:2,c:3,d:false},{a:1,c:'test'}], ['a','b','c']));

答案 1 :(得分:0)

您可以遍历键数组并将此键传递给另一个将使用forEach方法的函数。使用getMatchedKeyValues的{​​{1}}将返回其键匹配

的元素数组



forEach




答案 2 :(得分:0)

您可以使用Array.prototype.reduce

<!DOCTYPE html>
<html lang="de" style="width: 100%; height: 100%; margin: 0; padding: 0;">

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body style="width: 100%; height: 100%; margin: 0; padding: 0;">
  <div style="width: 100%; height: 10%;  display: inline-block; border: solid black 1px">
    <center>
      <div id="here" style="width: 50%; height: 100px; border-top-left-radius: 30%; border-bottom-right-radius: 30%; background-color: orange;">
      </div>
    </center>
  </div>
  <div style="width:80%; height:70%; margin-left: 10%; background: #FFFFB8; display: inline-block;">
  </div>
  <center>
    <div style="width: 50%; height: 100px; border-top-left-radius: 30%; border-bottom-right-radius: 30%; background-color: orange;">
    </div>
  </center>
</body>
</html>

输出:

let param1 = [{a:1,b:'1',c:true},{a:'1',b:2,c:3,d:false},{a:1,c:'test'}];
let param2 = ['a', 'b', 'c'];

function test(objArr, keys) {
  let returnObject = {};
  keys.forEach(key => returnObject[key] = []);

  return objArr.reduce((ret, obj) => {
    keys.forEach(key => {
      if (obj[key] !== undefined)
        ret[key].push(obj[key]);
    });
    return ret;
  }, returnObject);
}

console.log(JSON.stringify(test(param1, param2)));

答案 3 :(得分:0)

我在下面编码,请看看这个解决方案。

&#13;
&#13;
function test(arr, arr1) {
  return arr.reduce((total, current) => {
    arr1.forEach(curr => {
      if (typeof total[curr] === "undefined") total[curr] = [];
      if (current[curr]) total[curr].push(current[curr]);
    });
    return total;
  }, {});
}
console.log(
  test(
    [
      { a: 1, b: "1", c: true },
      { a: "1", b: 2, c: 3, d: false },
      { a: 1, c: "test" }
    ],
    ["a", "b", "c"]
  )
);
&#13;
&#13;
&#13;