Как сравнить два массива с помощью lodash (порядок имеет значение) - PullRequest
0 голосов
/ 15 октября 2018

var arr1=[3,4,5,6,7,1,9];
var arr2=[1,3,4,6,7,5,9];

Я хочу сравнить arr2 с arr1.Но методы difference() и intersection(), кажется, только находят, имеют ли два массива одинаковые элементы или нет.Я хочу сравнить два массива по точкам, например, arr1 [0] и arr2 [0], arr1 [1] и arr2 [1].И это должно показать:

intersection: 6,7,9
difference: 1,3,4,5

Как мне этого добиться?

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Вы можете сделать это в lodash, сжав оба массива, отфильтровав их, а затем взяв последний элемент каждой пары.Компаратор для пересечения состоит в том, что пара равна.Разница заключается в том, что пары не равны.

const arr1 = [3,4,5,6,7,1,9];
const arr2 = [1,3,4,6,7,5,9];

const compare = (comperator) => (arr1, arr2) => 
  _.zip(arr1, arr2)
  .filter(comperator)
  .map(_.last);

const eq = _.spread(_.eq);

const intersection = compare(eq);
  
const difference = compare(_.negate(eq));

console.log('intersection ', intersection(arr1, arr2));
console.log('difference ', difference(arr1, arr2));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 08 ноября 2018

Это также можно решить с помощью reduce:

var arr1 = [3, 4, 5, 6, 7, 1, 9];
var arr2 = [1, 3, 4, 6, 7, 5, 9];

const f = (a, b) => b.reduce((r,c,i) => (a[i] == c ? 
  r.intersection.push(c) : 
  r.difference.push(c), r), {intersection: [], difference: []})

console.log(f(arr1, arr2))

Когда вы начинаете с предварительно установленного объекта-накопителя и сравниваете каждое значение массива, используя индекс.

0 голосов
/ 15 октября 2018

Вы можете выполнить итерацию обоих массивов параллельно и отсортировать их в два отдельных набора:

 function* parallel(a, b) {
   for(let i = 0; i < a.length || i < b.length; i++)
     yield [ a[i], b[i] ];
 }

 const intersection = new Set, 
    difference = new Set;

 for(const [a, b] of parallel(arr1, arr2)) {
   if(a === b) 
     intersection.add(a);
   else
      difference.add(a).add(b);
 }

 console.log([...intersection], [...difference]);
...