Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何基于动态关键点创建嵌套对象_Javascript_Arrays - Fatal编程技术网

Javascript 如何基于动态关键点创建嵌套对象

Javascript 如何基于动态关键点创建嵌套对象,javascript,arrays,Javascript,Arrays,我需要将一些数据转换为特殊格式。棘手的部分是,它需要通过动态键进行分组和嵌套。因为原始数据是平面的 以下是一些简化的示例数据: const data = [ { category: 'Classic', price: 1, order: '1233-ABC' currency: 'EUR', }, { category: 'Classic', price: 2, order: '1234-ABC' currency: '

我需要将一些数据转换为特殊格式。棘手的部分是,它需要通过动态键进行分组和嵌套。因为原始数据是平面的

以下是一些简化的示例数据:

const data = [
  {
    category: 'Classic',
    price: 1,
    order: '1233-ABC'
    currency: 'EUR',
  },
  {
    category: 'Classic',
    price: 2,
    order: '1234-ABC'
    currency: 'EUR',
  },
  {
    category: 'Modern',
    price: 3,
    order: '1235-ABC'
    currency: 'USD',
  },
  {
    category: 'Classic',
    price: 4,
    order: '1236-ABC'
    currency: 'EUR',
  },
  {
    category: 'Modern',
    price: 5,
    order: '1237-ABC'
    currency: 'EUR',
  },
  {
    category: 'Classic',
    price: 6,
    order: '1238-ABC'
    currency: 'USD',
  },
  {
    category: 'Modern',
    price: 7,
    order: '1239-ABC'
    currency: 'USD',
  }
];
现在我想定义分组和聚合

例如:

grouping = ['category'];
sum = ['price'];
因此,它应该按
类别
键分组,并汇总所有
价格
键条目

//预期产量

[{
    category: 'Classic',
    price: 13
}, {
    category: 'Modern',
    price: 15
}]
[{
    category: 'Classic',
    price: 13,
    sub: [{
        currency: 'EUR',
        price: 7
    }, {
        currency: 'USD',
        price: 6
    }]
}, {
    category: 'Modern',
    price: 15,
    sub: [{
        currency: 'EUR',
        price: 9
    }, {
        currency: 'USD',
        price: 10
    }]
}]
我和reduce一起工作

代码如下:

let groupingsField = ['category'];
let aggregateField = ['price']

let [group, ...rest] = groupingsField
let [sum, ...noone] = aggregateField

const groupedData = data.reduce((acc, current) => {
  acc.push({
    [group]: current[group],
    [sum]: data.filter(item => item[group] === current[group])
    .map(el => el[sum])
    .reduce((total, current) => total + current)
  })

  return acc
}, [])
.reduce((acc, current) => {
  const x = acc.find(item => item[group] === current[group])

  return !x ? acc.concat([current]) : acc
}, [])
但是,我需要分组是动态的,如果存在超过1个值,它应该创建嵌套的
sub
数据集。应该可以添加多个分组

//例2

grouping = ['category', 'currency'];
sum = ['price'];
//预期产量

[{
    category: 'Classic',
    price: 13
}, {
    category: 'Modern',
    price: 15
}]
[{
    category: 'Classic',
    price: 13,
    sub: [{
        currency: 'EUR',
        price: 7
    }, {
        currency: 'USD',
        price: 6
    }]
}, {
    category: 'Modern',
    price: 15,
    sub: [{
        currency: 'EUR',
        price: 9
    }, {
        currency: 'USD',
        price: 10
    }]
}]
因此,如果我向分组添加另一个键

grouping = ['category', 'currency', 'something'];
它应该是三层深的巢穴

{
 category: 'Modern',
 price: 15,
 sub: [{
   currency: 'EUR',
   price: 9,
   sub: [{
     someting: ...
     price: ...
   }]
 }]
}
然而,我无法理解如何根据
分组动态添加嵌套。我想我需要一些递归


我希望能在这方面得到一些帮助

嗯。。。这确实是一个挑战,但我认为它正在发挥作用。。。也许不是用最花哨的方式,但我想也行

var newArr = [];
var MyObj = {};
var MyObj2 = {};


    for( i = 0; i < data.length; i++){
        if (data[i].category + '|' + data[i].currency in MyObj) MyObj[data[i].category + '|' + data[i].currency] += data[i].price;
        else MyObj[data[i].category + '|' + data[i].currency] = data[i].price;
    }

    for (var key in MyObj) {
        let keyArr=-1;
        let split_key = key.split("|");


        for( i = 0; i < newArr.length; i++){
            console.log(newArr[i].category + '/' +split_key[0] + i);
            if (newArr[i].category == split_key[0]) {

                keyArr=i;
                break;
            }
        }

    if (keyArr<0){
        MyObj2['category'] = split_key[0];
        MyObj2['price'] = MyObj[key];
        MyObj2['sub'] = [{currency: split_key[1], price: MyObj[key]}];
        newArr.push(MyObj2);
    }else{
        newArr[keyArr]['price']+=MyObj[key];
        newArr[keyArr]['sub'].push({currency: split_key[1], price: MyObj[key]});
    }

        MyObj2={};

    }
    console.log(newArr);
var newArr=[];
var MyObj={};
var MyObj2={};
对于(i=0;i

groups = ['category', 'currency']; // this can be dynamic 
sum = ['price'];

function createGroup (groups, data, sum, childNode = 'sub') {
    let [primaryGroup, ...rest] = groups;

    let groupedData = data.reduce((acc, current) => {
    let chunk = {
        [primaryGroup]: current[primaryGroup],
        [sum]: data.filter(item => item[primaryGroup] === current[primaryGroup])
        .map(el => el[sum])
        .reduce((total, current) => total + current),
       ...(rest.length > 0 ? {[childNode]: createGroup(rest, data)} : {})
    }

    acc.push(chunk)
    return acc
  }, [])
    .reduce((acc, current) => {
        const x = acc.find(item => item[primaryGroup] === current[primaryGroup])
        return !x ? acc.concat([current]) : acc
    }, [])

  return groupedData;
}


如果你愿意使用libs..看看lodash可能的@PsyGik副本在loadash中找不到任何有用的东西来执行基于键的动态n深度嵌套。@KunalMukherjee不完全是这样。正如我写的,我自己只介绍了一个聚合器和一个分组的用例。但是我希望它能与多个分组一起工作,一个重新嵌套。