繁体   English   中英

根据元素属性创建大数组块

[英]Create chunks of big array based on element properties

我有一个问题,解决它的方法是根据它们的属性(ID)对我的数组中的元素进行分组。 让我解释:

这是给定的数组:

[ { project_id: 'project:710f57c6bb18753dfeaad60b7a7437df',
    end_date: '2017-05-18',
    invoice_method: 'FixedFee',
    amount: '1.000000',
    price: '134.000000' },
  { project_id: 'project:710f57c6bb18753dfeaad60b7a7437df',
    start_date: '2017-06-01',
    subscription_cycle: 'Month',
    invoice_method: 'Subscription',
    amount: '1.000000',
    price: '49.000000' },

{ project_id: 'project:abcdefghijklmnop',
    start_date: '2017-06-01',
    subscription_cycle: 'Month',
    invoice_method: 'Subscription',
    amount: '1.000000',
    price: '49.000000'},

{ project_id: 'project:abcdefghijklmnop',
    start_date: '2017-06-01',
    subscription_cycle: 'Month',
    invoice_method: 'Subscription',
    amount: '1.000000',
    price: '49.000000'},

]

这个大数组中的前 2 个元素具有相同的 ID,后 2 个元素具有相同的 ID,所以我想要的 output 是这样的:

//MAIN ARRAY
[ 
    //ONE CHUNK
    [
        { project_id: 'project:710f57c6bb18753dfeaad60b7a7437df',
        end_date: '2017-05-18',
        invoice_method: 'FixedFee',
        amount: '1.000000',
        price: '134.000000' },

        { project_id: 'project:710f57c6bb18753dfeaad60b7a7437df',
        start_date: '2017-06-01',
        subscription_cycle: 'Month',
        invoice_method: 'Subscription',
        amount: '1.000000',
        price: '49.000000' }
    ]

    //ONE CHUNK
    [
        { project_id: 'project:abcdefghijklmnop',
        start_date: '2017-06-01',
        subscription_cycle: 'Month',
        invoice_method: 'Subscription',
        amount: '1.000000',
        price: '49.000000'},

        { project_id: 'project:abcdefghijklmnop',
        start_date: '2017-06-01',
        subscription_cycle: 'Month',
        invoice_method: 'Subscription',
        amount: '1.000000',
        price: '49.000000'}

    ]


]

有些人喜欢这样根据键名进行分组。

不准确,但你可以这样做。 .reduce()将起作用。

这里 keyName project_id用于对对象数组进行分组。

const data = [ { project_id: 'project:710f57c6bb18753dfeaad60b7a7437df',
    end_date: '2017-05-18',
    invoice_method: 'FixedFee',
    amount: '1.000000',
    price: '134.000000' },
  { project_id: 'project:710f57c6bb18753dfeaad60b7a7437df',
    start_date: '2017-06-01',
    subscription_cycle: 'Month',
    invoice_method: 'Subscription',
    amount: '1.000000',
    price: '49.000000' },

{ project_id: 'project:abcdefghijklmnop',
    start_date: '2017-06-01',
    subscription_cycle: 'Month',
    invoice_method: 'Subscription',
    amount: '1.000000',
    price: '49.000000'},

{ project_id: 'project:abcdefghijklmnop',
    start_date: '2017-06-01',
    subscription_cycle: 'Month',
    invoice_method: 'Subscription',
    amount: '1.000000',
    price: '49.000000'
  }]

let result = data.reduce(function (r, a) {
        r[a.project_id] = r[a.project_id] || [];
        r[a.project_id].push(a);
        return r;
    }, []);

console.log(result);

由于您不要求提供代码,因此这里有一个大纲:

  1. 创建一个Map或 object 以便您可以快速找到一个 id(作为键)和关联的子数组(作为值)。

  2. 迭代您的数据,并为每个 object 在您的地图/对象中查找子数组。 如果该 id 还没有条目,则为该 id 创建一个空子数组。 在任何一种情况下,将当前 object 推送到该子阵列

  3. 最后从您的地图/对象中获取所有这些子数组并将它们连接到一个最终数组。

隐藏代码,以防您无法使其工作:

 const data = [ { project_id:'project:710f57c6bb18753dfeaad60b7a7437df', end_date: '2017-05-18',invoice_method: 'FixedFee',amount: '1.000000',price: '134.000000' },{ project_id: 'project:710f57c6bb18753dfeaad60b7a7437df',start_date: '2017-06-01',subscription_cycle: 'Month',invoice_method: 'Subscription',amount: '1.000000',price: '49.000000' },{ project_id: 'project:abcdefghijklmnop',start_date: '2017-06-01',subscription_cycle: 'Month',invoice_method: 'Subscription',amount: '1.000000',price: '49.000000'},{ project_id: 'project:abcdefghijklmnop',start_date: '2017-06-01',subscription_cycle: 'Month',invoice_method: 'Subscription',amount: '1.000000',price: '49.000000'}]; let map = new Map(data.map(o => [o.project_id, []])); data.forEach(o => map.get(o.project_id).push(o)); let result = Array.from(map.values()); console.log(result);

检查此解决方案,希望对您有所帮助。

var initailArray = [ { project_id: 'project:710f57c6bb18753dfeaad60b7a7437df',
    end_date: '2017-05-18',
    invoice_method: 'FixedFee',
    amount: '1.000000',
    price: '134.000000' },
  { project_id: 'project:710f57c6bb18753dfeaad60b7a7437df',
    start_date: '2017-06-01',
    subscription_cycle: 'Month',
    invoice_method: 'Subscription',
    amount: '1.000000',
    price: '49.000000' },

{ project_id: 'project:abcdefghijklmnop',
    start_date: '2017-06-01',
    subscription_cycle: 'Month',
    invoice_method: 'Subscription',
    amount: '1.000000',
    price: '49.000000'},

{ project_id: 'project:abcdefghijklmnop',
    start_date: '2017-06-01',
    subscription_cycle: 'Month',
    invoice_method: 'Subscription',
    amount: '1.000000',
    price: '49.000000'},
];

let dummyObj = {};

initailArray.forEach((data)=>{
  if(!dummyObj[data.project_id]){
    dummyObj[data.project_id] = [data];
  }else{
    dummyObj[data.project_id].push(data);
  }
});

let finalResult = [Object.values(dummyObj)];

console.log("finalResult", finalResult);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM