Разница между коллекцией и массивом строк - PullRequest
0 голосов
/ 17 октября 2019

У меня есть коллекция вроде

const collection = [{url: '/string/'}, {url: '/string-2/'}]

и array из string

const strings = ['/string/']

Я пытаюсь сделать различие между ними таким образом, чтобырезультат

const difference = [{url: '/string-2/'}]

Я пытался с lodash _.filter

const difference = _.filter(collection, obj => strings.every(url => url !== obj.self));

, но это не работает. Пробовал с ._partition, но он возвращает несколько массивов, в то время как я хотел бы иметь только коллекцию без объекта

Ответы [ 4 ]

1 голос
/ 17 октября 2019

Попробуйте differenceWith:

const collection = [{url: '/string/'}, {url: '/string-2/'}]

const strings = ['/string/']

result = _.differenceWith(collection, strings, (a, b) => a.url === b)

console.log(result) // [ { url: '/string-2/' } ]
1 голос
/ 17 октября 2019

Вы можете сделать это без lodash, используя .filter() и проверьте, включен ли текущий массив url в массив strings следующим образом:

const collection = [{url: '/string/'}, {url: '/string-2/'}];
const strings = ['/string/'];

const difference = collection.filter(({url}) => strings.includes(url));
console.log(difference);

... или, если каждый url уникален, более эффективным способом было бы создать Map, где каждый ключ вкарта url, которая указывает на ваш объект. Затем .map() над вашим массивом strings, например:

const collection = [{url: '/string/'}, {url: '/string-2/'}];
const strings = ['/string/'];

const collection_map = new Map(collection.map(obj => [obj.url, obj]));
const difference = strings.map(str => collection_map.get(str));
console.log(difference);

С помощью lodash вы можете применить ту же логику, что и выше, используя метод _.filter() с _.includes(), например:

const collection = [{url: '/string/'}, {url: '/string-2/'}];
const strings = ['/string/'];

const difference = _.filter(collection, obj => _.includes(strings, obj.url));
console.log(difference);
<script src="https://cdn.jsdelivr.net/lodash/4.16.4/lodash.min.js"></script>
0 голосов
/ 17 октября 2019

Вы можете сделать это через ванильный JS. Необходимые методы: filter () и some () :

const collection = [{url: '/string/'}, {url: '/string-2/'}];
const strings = ['/string/'];

const difference = collection.filter(({url}) => strings.some(s=> url !== s));
console.log(res);
0 голосов
/ 17 октября 2019

Вы можете сделать это с помощью простых Array.prototype.includes() & Array.prototype.filter(), например:

const collection = [{url: '/string/'}, {url: '/string-2/'}];

const strings = ['/string/'];

const difference = collection.filter(c => strings.includes(c.url) );
console.log(difference)
...