从JSON中获取唯一值而无需循环

时间:2018-07-18 16:59:42

标签: javascript arrays lodash

我正在使用以下格式的数组:

const resultData = [
  [1, 2, 'a', 'b'],
  [1, 4, 'c', 'f'],
  [2, 5, 'a', 'b'],
  [1, 2, 'c', 'd'],
  [9, 3, 'c', 'f'],
  [5, 4, 'f', 'g']
]

我正在尝试以以下格式进行转换:

[{
  value: "a,b",
  data: [
    [1, 2],
    [2, 5]
  ]
}, {
  value: "c,f",
  data: [
    [1, 4],
    [9, 3]
  ]
}, {
  value: "c,d",
  data: [
    [1, 2]
  ]
}, {
  value: "f,g",
  data: [
    [5, 4]
  ]
}]

我正在使用当前带有for循环的地图:

var mapp = new Map;
_.each(resultData, item => {
  var x = item.col.slice(2);
  if (mapp.has(x.toString())) {
    var temp = mapp.get(x.toString());
    temp.push([item.col[0], item.col[1]]);
    mapp.set(x.toString(), temp);
  } else {
    var valuesArray = [];
    valuesArray.push([item.col[0], item.col[1]])
    mapp.set(x.toString(), valuesArray);
  }
});

我有一个庞大的数据集。有没有可能没有循环或任何其他方法的方法?

4 个答案:

答案 0 :(得分:0)

我将使用reduce生成结果:

  1. 检查键值是否已经存在
  2. 如果有,请将新项目附加到数据数组中
  3. 如果没有,请使用数据创建新对象

const resultData = [
  [1, 2, 'a', 'b'],
  [1, 4, 'c', 'f'],
  [2, 5, 'a', 'b'],
  [1, 2, 'c', 'd'],
  [9, 3, 'c', 'f'],
  [5, 4, 'f', 'g']
]

let result = resultData.reduce((arr, itm) => {
  let value = itm[2] + ',' + itm[3]
  let item = arr.find(i => i.value == value)
  if (!item) arr.push({ value, data: [[itm[0], itm[1]]] })
  else item.data.push([itm[0], itm[1]])
  return arr
}, [])

console.log(result)

答案 1 :(得分:0)

您可以使用如下所示的reduceObject.values方法

const resultData = [[1,2,'a','b'],[1,4,'c','f'],[2,5,'a','b'],[1,2,'c','d'],[9,3,'c','f'],[5,4,'f','g']]

const res = resultData.reduce((acc, item) => {
   const key = item.slice(2).join();
   const value = item.slice(0, 2);
   
   if(!acc[key]) {
      acc[key] = {value: key, data: [value]};
   } else {
      acc[key] = {...acc[key], data: [...acc[key].data, value]}  
   }
   return acc;
}, {});

console.log(Object.values(res));

答案 2 :(得分:0)

JavaScript数组具有.map方法:

var newArray = resultData.map(function(arrayMember){

    var objectToReturn = {};

    objectToReturn['value'] = arrayMember; // add other transformations

    return objectToReturn;

}); // map

答案 3 :(得分:0)

另一种解决方案:

const res = _.chain(resultData)
    .groupBy(item => _.takeRight(item, 2).join(','))
    .mapValues((items, value) => ({
        value,
        data: _.map(items, arr => _.take(arr, 2))
    }))
    .values() 
    .value();