按数组值分组记录

时间:2015-06-11 07:11:44

标签: javascript jquery arrays

我有一个数组阵列(数组格式的CSV),每行都是一个销售,然后内部数组有各种细节,但我需要将这些分组到事务中以通过我们的直到,没有2个项目是在每次交易中都是一样的,因为我们现在允许数量或每次交易手动添加超过1个相同的项目(拍我!)。

data=
[
    ['red apple', 'john'],
    ['green apple', 'jim'],
    ['red apple', 'terry'],
    ['green apple', 'baz'],
    ['small orange', 'dave'],
    ['red apple', 'tim'],
    ['green apple', 'sam'],
    ['red apple', 'steve'],
    ['rotten apple', 'me']
]

需要成为

transactions=
[
    [
        ['red apple', 'john'],
        ['green apple', 'jim'],
        ['small orange', 'dave'],
        ['rotten apple', 'me']
    ],
    [
        ['red apple', 'terry'],
        ['green apple', 'baz']

    ],
    [
        ['red apple', 'tim'],
        ['green apple', 'sam']
    ],
    [
        ['red apple', 'steve']
    ]
]

Javascript / Jquery中最有效的方法是什么?

4 个答案:

答案 0 :(得分:2)

可能不是最有效率,但有效: http://jsfiddle.net/ej20ek1v/

基本上你循环遍历数组,而它不是空的。然后检查当前密钥是否已存在于tmp中(表示单个事务)。如果不存在,只需按下它并将其从原始集合中删除。如果有,你不需要做任何事情。在for循环结束时,您将事务添加到partitioned数组中。当您的原始数据为空时,您就完成了。

编辑1 : 正如@Regent指出的那样,我的小提琴里有一个小虫。请参阅修订版: http://jsfiddle.net/ej20ek1v/1/

编辑2 : 还有一个错误:虽然data不为空,但意味着检查while(data.length > 0) {...而不是while(data.length > 1) {...

很抱歉给您带来不便。最后的小提琴:http://jsfiddle.net/ej20ek1v/2/

答案 1 :(得分:2)



var data = [
  ['red apple', 'john'],
  ['green apple', 'jim'],
  ['red apple', 'terry'],
  ['green apple', 'baz'],
  ['small orange', 'dave'],
  ['red apple', 'tim'],
  ['green apple', 'sam'],
  ['red apple', 'steve'],
  ['rotten apple', 'me']
];

var map = {};
var max = 0;

for (var i in data) {
  var item = data[i][0];
  if (!map[item])
    map[item] = [];

  map[item].push(data[i][1]);
  if (map[item].length > max)
    max = map[item].length;
}

var result = [];

for (var i = 0; i < max; i++) {
  var transaction = [];

  for (var item in map) {
    if (i < map[item].length) {
      transaction.push([item, map[item][i]]);
    }
  }

  result.push(transaction);
}

// print `result`
alert(JSON.stringify(result, null, 4));
&#13;
&#13;
&#13;

答案 2 :(得分:1)

有点晚了,但是我在后面的窗口打开了一个小试验,并且不想让它完成:

function GetTransitions(arr) {
    var ranks = {}; //object to hold count for each fruit
    var transactions = []; //result object
    arr.forEach(function(el){ 
      var transindex = (ranks[el[0]] || 0); //previous amount of fruit

      var transitems = transactions[transindex] || ( transactions[transindex] = []); //get existing transaction or start new one
      transitems.push(el);

      ranks[el[0]] = ++transindex; //store count for fruit
    });
  return transactions;
}

示例:JsBin

答案 3 :(得分:1)

&#13;
&#13;
var data = [
  ['red apple', 'john'],
  ['green apple', 'jim'],
  ['red apple', 'terry'],
  ['green apple', 'baz'],
  ['small orange', 'dave'],
  ['red apple', 'tim'],
  ['green apple', 'sam'],
  ['red apple', 'steve'],
  ['rotten apple', 'me']
];
var transactionsClassifiedByApple = {};
var result = [];

for (var i = 0; i < data.length; i++) {
  var transaction = data[i];
  if (transactionsClassifiedByApple[transaction[0]] === undefined) {
    transactionsClassifiedByApple[transaction[0]] = [];
  }
  transactionsClassifiedByApple[transaction[0]].push(transaction);
}

for (var prop in transactionsClassifiedByApple) {
  for (var i = 0; i < transactionsClassifiedByApple[prop].length; i++) {
    var currentTransaction = transactionsClassifiedByApple[prop][i];
    if (result.length <= i) {
      var tempArr = [];
      tempArr.push(currentTransaction);
      result.push(tempArr);
    } else {
      result[i].push(currentTransaction);
    }
  }
}
alert(JSON.stringify(result, null, 4));
&#13;
&#13;
&#13;

相关问题