2015-06-11 2 views
-1

У меня есть массив массивов (CSV в формате массива), каждая строка - это продажа, а затем внутренние массивы имеют различные детали, однако мне нужно сгруппировать их в транзакции, чтобы пронести наши до, без двух элементов, одинаковых в каждой транзакции, так как наши до сих пор позволяют qty или вручную добавлять более 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?

+2

Можете ли вы описать логику результирующего массива немного лучше. Трудно понять, как вы пришли к такому результату. Я вижу, что каждая группа эффективно разделяется первым дубликатом, но в этом случае почему «гнилое яблоко» переходит в первую группу? –

+0

В основном каждая транзакция может содержать только один элемент, потому что это только 1 гнилое яблоко, которое оно занимает в первой транзакции, потому что есть четыре красных яблока, которые они должны быть распределены по 4 транзакциям. – dt192

+0

Спасибо всем, я попробую это, когда буду дома с работы, очень ценю. – dt192

ответ

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

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

Ваша структура данных результатов не совпадает с представленной в вопросе, не так ли? – Regent

+0

@Regent OH, вы правы. Извините, я не проверил полученный массив близко. после 'data.splice (i, 1);' вы должны уменьшать 'i', так как элемент удаляется из массива.После этой модификации код работает: http://jsfiddle.net/ej20ek1v/1/ – Anticom

+0

Прошу прощения, у меня еще не было утреннего кофе. Наконец, обновление должно быть рабочим решением. – Anticom

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));

+0

Я не могу разглядеть разницу. Не могли бы вы конкретно указать на это? – Neverever

+0

Моя ошибка, извините. – Regent

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));

Смежные вопросы