JavaScript动态创建和填充数组

时间:2017-09-09 09:49:22

标签: javascript arrays sorting dynamic

我正在尝试根据另一个数组中的属性动态创建数组变量。样本数据:

var arr = [{category: 'bill', date: '2017/04/29', total: 35049.48999999998},
{category: 'bill', date: '2017/05/12', total: 249.03},
{category: 'bill', date: '2017/11/05', total: 568.5499999999998},
{category: 'electrical appliance', date: '2017/08/09', total: 3930.76},
{category: 'electrical appliance', date: '2017/03/28', total: 532.1},
{category: 'food', date: '2017/08/09', total: 639.05},
{category: 'food', date: '2017/08/31', total: 2653.05}];

我想要实现的是,我想为每个类别创建一个数组,然后将动态创建的数组作为参数传递给另一个函数。

我这样做的原因是因为我想计算每个类别的上周和本周花费的总金额,并在不同的部分显示它们。

例如,本周花的食物是639.05,上周花的食物是2653.05。本周电器用电费用为3930.76等。

我真正不确定的是如何将类别归为一个临时变量,然后将临时变量传递给另一个函数,以便我计算上周/上周的花费。

我已经有一个函数计算这个/上周的花费并且它工作正常,该函数的参数是一个数组,在这种情况下,我试图将类别组合在一起然后单独传递它而不是只需传递所有类别的数组即可执行计算。

我怎样才能真正实现这一目标?谢谢!

2 个答案:

答案 0 :(得分:1)

您可以使用对象进行分组和迭代组,您可以获取对象的键并迭代它们。

var array = [{ category: 'bill', date: '2017/04/29', total: 35049.48999999998 }, { category: 'bill', date: '2017/05/12', total: 249.03 }, { category: 'bill', date: '2017/11/05', total: 568.5499999999998 }, { category: 'electrical appliance', date: '2017/08/09', total: 3930.76 }, { category: 'electrical appliance', date: '2017/03/28', total: 532.1 }, { category: 'food', date: '2017/08/09', total: 639.05 }, { category: 'food', date: '2017/08/31', total: 2653.05 }],
    groups = Object.create(null);

array.forEach(function (o) {
    groups[o.category] = groups[o.category] || [];
    groups[o.category].push(o);
});

console.log(groups.food); // just food
console.log(groups);

// iterate keys of groups and some values
Object.keys(groups).forEach(function (k) {
    groups[k].forEach(function (o) {
        console.log(k, o.date);
    });
});
.as-console-wrapper { max-height: 100% !important; top: 0; }

要访问单个已知类别,您可以使用property accessor,例如

groups.food                    // dot notation
groups['electrical appliance'] // bracket notation

答案 1 :(得分:0)

我想首先将数组转换为一个对象,该对象将成为类别名称,值为该类别的所有扩展数组。

之后,您将能够将逻辑应用于它。

var arr = [{
    category: 'bill',
    date: '2017/04/29',
    total: 35049.48999999998
  },
  {
    category: 'bill',
    date: '2017/05/12',
    total: 249.03
  },
  {
    category: 'bill',
    date: '2017/11/05',
    total: 568.5499999999998
  },
  {
    category: 'electrical appliance',
    date: '2017/11/27',
    total: 3930.76
  },
  {
    category: 'electrical appliance',
    date: '2017/03/28',
    total: 532.1
  },
  {
    category: 'food',
    date: '2017/03/10',
    total: 639.05
  },
  {
    category: 'food',
    date: '2017/06/22',
    total: 2653.05
  }
];

const obj = arr.reduce((result, current) => {
  result[current.category] = result[current.category] || {
    cats: [],
    total: 0
  };
  result[current.category].cats.push(current);
  result[current.category].total += current.total; // some logic
  return result;
}, {});

console.log(obj)