2015-07-01 2 views
1

У меня есть куча массивов и я хочу, чтобы союз им, lodash делает это:объединение массивов и сохранить порядка

_.union(['a', 'c'], ['a','b', 'c'], ['b', 'z'], ['y']) // ["a", "c", "b", "z", "y"] 

Что я ожидаю мой массив, чтобы изменить, если требуется, то есть:

  • Первое появление у нас есть ['a', 'c']
  • Второе явление мы б после поэтому он должен вернуть ['a', 'b', 'c']
  • Третье явление мы имеем г после Ь поэтому она должна Ретур п ['a', 'b', 'z', 'c']
  • Четвертое явление мы только у поэтому он должен быть добавлен в конец массива ['a', 'b', 'z', 'c', 'y']

Я ожидаю:

_.union(['a', 'c'], ['a','b', 'c'], ['b', 'z'], ['y']) // ['a', 'b', 'z', 'c', 'y'] 

У меня есть

_.union(['a', 'c'], ['a','b', 'c'], ['b', 'z'], ['y']) // ["a", "c", "b", "z", "y"] 

Как мог Я этого добиваюсь?

Edit: Оптимальной @ скрипку Энди, вот моя последняя рабочая версия Demo

+0

Я бы предположить, вам придется «сортировать» после объединения – atmd

+0

Что вы подразумеваете под «перегруппировкой»? Я не понимаю механизм за конечным ожидаемым результатом. – axelduch

+0

Я просто хочу сохранить порядок, если в одном массиве c перед b тогда последний массив должен сохранить этот порядок: '['a', 'b'], ['c', 'b'] => [' a ',' c ',' b '] ', потому что c было до b во втором массиве. –

ответ

2

Вот многословно, не lodash версия:

function union() { 
    var arrs = [].slice.call(arguments); 
    var out = []; 
    for (var i = 0, l = arrs.length; i < l; i++) { 
     for (var j = 0, jl = arrs[i].length; j < jl; j++) { 
      var currEl = arrs[i][j]; 
      if (out.indexOf(currEl) === -1) { 
       if (j - 1 !== -1 && out.indexOf(arrs[i][j - 1]) > -1) { 
        out.splice(out.indexOf(arrs[i][j - 1]) + 1, 0, currEl); 
       } else { 
        out.push(currEl); 
       } 
      } 
     } 
    } 
    return out; 
}; 

var result = union(['a', 'c'], ['a', 'b', 'c'], ['b', 'z'], ['y']); 

console.log(result) // [ "a", "b", "z", "c", "y" ] 

DEMO

+0

Выглядит потрясающе, я проверю. –

+0

Он отлично работает, пока я не начну добавлять вещи перед существующими предметами, см. Демо: http://jsfiddle.net/z8nnqp50/3/ –

+1

Нет проблем, я придумал http://jsfiddle.net/z8nnqp50/4 / –