我有一个数组阵列(数组格式的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中最有效的方法是什么?
答案 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;
答案 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)
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;