Хотя вы можете использовать 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>