Найти совпадение между двумя наборами данных в JavaScript с помощью lodash - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть два списка данных, и я хотел бы сравнить каждый элемент listA со значением listB, используя lodash .

Пример:

var listA = ["Y", "A", "Z", "T"];
var listB = [{id:15467, value:"E"}, {id:23453, value:"A"}, {id:76564, value:"O"}, {id:86543, value:"T"}];

Возьмите по одному элементу за раз на listA и найдите соответствующее значение listB.Если true, верните объект listB.

result = [{id:23453, value:"A"}, {id:86543, value:"T"}]

Надеюсь, вы сможете мне помочь?

Ответы [ 4 ]

0 голосов
/ 24 февраля 2019

Хотя вы можете использовать lodash _.intersectionWith(), чтобы найти общий знаменатель между двумя массивами, элементы и порядок будут такими: listB:

const listA = ["Y", "A", "Z", "T"];
const listB = [{ id: 86543, value: "T" }, { id: 15467, value: "E" }, { id: 23453, value: "A" }, { id: 76564, value: "O" }]; // I've moved value: "T" to the start

const result = _.intersectionWith(
  listB, 
  listA,
  (a, b) => a.value === b
);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Чтобы получить элементы в listB, упорядоченные по listA, используйте lodash's _.flow() для создания функции.Преобразуйте listB в объект (с _.keyBy()), установив value в качестве ключей.Извлеките предметы, заказанные listA с помощью _.at(), а затем _.reject всех неопределенных предметов:

const { flow, partialRight: pr, keyBy, at, reject, isUndefined } = _;

const fn = paths => flow(
  pr(keyBy, 'value'), // convert listB to an object, with the value as the key
  pr(at, paths), // get the items from the object ordered by listA
  pr(reject, isUndefined) // remove undefined items
);

const listA = ["Y", "A", "Z", "T"];
const listB = [{ id: 86543, value: "T" }, { id: 15467, value: "E" }, { id: 23453, value: "A" }, { id: 76564, value: "O" }];

const result = fn(listA)(listB);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 24 февраля 2019

Вы можете использовать операторы filter и includes:

  • "Фильтр" listB элементы
  • ... используя функцию предиката
  • ... который проверяет, включает ли listA value
_.filter(listB, function(listBItem) { 
    return _.includes(listA, listBItem.value);
});
0 голосов
/ 24 февраля 2019

Попробуйте это.Отфильтровать все itens

let listA = ["Y", "A", "Z", "T"];
let listB = [{id:15467, value:"E"}, {id:23453, value:"A"}, {id:76564, value:"O"}, {id:86543, value:"T"}];
let result = [];

listA.map(letter =>{
  for (var i = 0; i < listB.length; i++) {
    if(letter == listB[i].value){
      result.push(listB[i])
    }
  }
})


console.log(result)
0 голосов
/ 24 февраля 2019

Вы можете использовать _.filter с _.includes.

var listA = ["Y", "A", "Z", "T"],
    listB = [{ id: 15467, value: "E" }, { id: 23453, value: "A" }, { id: 76564, value: "O" }, { id: 86543, value: "T" }],
    result = _.filter(listB, ({ value }) => _.includes(listA, value));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
...