Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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_Jquery_Arrays - Fatal编程技术网

Javascript 按数组值对记录分组

Javascript 按数组值对记录分组,javascript,jquery,arrays,Javascript,Jquery,Arrays,我有一个数组(数组格式的CSV),每一行都是销售,然后内部数组有各种详细信息,但是我需要将它们分组到交易中,以便通过我们的收银台进行收银,每个交易中没有两个项目相同,因为我们的收银台现在允许数量或手动添加每笔交易超过一个相同的项目(开枪打我!) 需要成为 transactions= [ [ ['red apple', 'john'], ['green apple', 'jim'], ['small orange', 'dave'],

我有一个数组(数组格式的CSV),每一行都是销售,然后内部数组有各种详细信息,但是我需要将它们分组到交易中,以便通过我们的收银台进行收银,每个交易中没有两个项目相同,因为我们的收银台现在允许数量或手动添加每笔交易超过一个相同的项目(开枪打我!)

需要成为

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中最有效的方法是什么?

可能不是最有效的方法,但可以:

基本上,您在数组上循环,而它不是空的。然后检查当前键是否已经存在于
tmp
(表示单个事务)。如果不存在,只需推送它并将其从原始集合中删除。如果存在,则无需执行任何操作。在for循环结束时,将事务添加到
分区的
数组中。当原始数据为空时,即完成

编辑1: 正如@Regent指出的,我的小提琴中有一个bug。请参阅修复版本:

编辑2: 仍然有一个错误:While
data
notempty意味着检查
While(data.length>0){…
not
While(data.length>1){…

很抱歉给您带来不便。最后一把小提琴:

var数据=[
[‘红苹果’、‘约翰’],
[‘青苹果’、‘吉姆’],
[‘红苹果’、‘特里’],
[‘青苹果’、‘巴兹’],
[‘小橘子’、‘戴夫’],
[‘红苹果’、‘蒂姆’],
[‘青苹果’、‘山姆’],
[‘红苹果’、‘史蒂夫’],
[‘烂苹果’、‘我’]
];
var-map={};
var max=0;
用于(数据中的var i){
var项目=数据[i][0];
如果(!映射[项目])
地图[项目]=[];
地图[项目].push(数据[i][1]);
如果(映射[项目]。长度>最大值)
最大值=地图[项目]。长度;
}
var结果=[];
对于(变量i=0;ialert(JSON.stringify(result,null,4));
添加得有点晚,但我在后台窗口打开了一个小测试,不想让它未完成:

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;
}
示例:

var数据=[
[‘红苹果’、‘约翰’],
[‘青苹果’、‘吉姆’],
[‘红苹果’、‘特里’],
[‘青苹果’、‘巴兹’],
[‘小橘子’、‘戴夫’],
[‘红苹果’、‘蒂姆’],
[‘青苹果’、‘山姆’],
[‘红苹果’、‘史蒂夫’],
[‘烂苹果’、‘我’]
];
var transactionsClassifiedByApple={};
var结果=[];
对于(变量i=0;i如果(result.length您能更好地描述结果数组背后的逻辑吗?很难看出您是如何得出这个结果的。我可以看到每个组都被第一个副本有效地分隔开了,但是在这种情况下,
烂苹果
为什么会进入第一个组?基本上每个事务只能包含任何项目中的一个,因为thete只是第一笔交易中的一个烂苹果,因为有4个红苹果必须分散在4笔交易中。谢谢大家,我下班回家后会试用这些,非常感谢。我对一个50k数据集进行了基准测试,结果是我。Name 200ms、Asheesh 227ms、Neverer 381ms和Anticom 12724ms。感谢大家的支持答案,我有+1你们所有人,我会选择我。名字作为我的答案。你的结果数据结构与问题中提供的不一样,是吗?@Regent哦,你是对的。很抱歉,我没有充分检查结果数组closeley。在
data.splice(I,1)之后;
由于从数组中删除了一个元素,您必须减小
i
。在这次修改后,代码可以工作:对不起,我还没有喝早餐咖啡。更新2应该是一个有效的解决方案。我无法发现区别。您能具体指出吗?
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;
}