Удаление элементов в массиве с использованием Lodash

Есть более простой способ, есть таблица ссылок, например:

Таблица 1: клиенты, информация о клиенте, бла-бла-бла

Таблица 2: курсы, информация о курсе, бла-бла

Таблица 3: clientid, courseid

Затем выполните JOIN, и вы отправитесь на гонки.

23
задан bard 20 January 2015 в 02:15
поделиться

5 ответов

Поскольку, когда fruit равно "Celery", вы тестируете:

"Celery" === 'Apple' || 'Banana' || 'Orange'

, который оценивается как

false || true || true

, что составляет true.

Вы не можете использовать этот синтаксис. Или проделайте длинный путь:

_.remove(fruits, function (fruit) {
  return fruit === 'Apple' || fruit === 'Banana' || fruit === 'Orange'
});

или проверьте членство в массиве:

_.remove(fruits, function (fruit) {
  return _.indexOf(['Apple', 'Banana', 'Orange'], fruit) !== -1
});

Это не ограничивается JavaScript и фактически является распространенной ошибкой (например, этот вопрос )

50
ответ дан Community 20 January 2015 в 02:15
поделиться

Проблема не в Lo-Dash; ваша проблема с вашим условием в вашей функции обратного вызова. Это:

return fruit === 'Apple' || 'Banana' || 'Orange';

Не является неверным . Вам нужно сравнить fruit с каждой строкой:

return fruit === 'Apple' || fruit === 'Banana' || fruit === 'Orange';

Или , вы можете использовать другую функцию Lo-Dash, чтобы сделать ее немного более компактной:

_.remove(fruits, function (fruit) {
  return _.contains(['Apple', 'Banana', 'Orange'], fruit);
})

Примечание: В последних версиях Lo-Dash функция _.contains устарела. Пожалуйста, используйте _.includes

8
ответ дан Hristo Eftimov 20 January 2015 в 02:15
поделиться

Вы можете использовать метод _.pull от lodash 2.0 и выше

var fruits = ['Apple', 'Banana', 'Orange', 'Celery'];

_.pull(fruits, 'Apple', 'Banana', 'Orange'); // ['Celery']

document.write(fruits);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.6.1/lodash.js"></script>
33
ответ дан gustavogelf 20 January 2015 в 02:15
поделиться

Если вы хотите удалить набор элементов из другого набора, существуют определенные операции, предназначенные специально для этого. Lodash имеет https://lodash.com/docs/4.17.2#difference , который принимает два параметра массива A и B и возвращает другой массив, который содержит все элементы A, которых нет в B.

В вашем случае вы можете написать

const fruits = ['Apple', 'Banana', 'Orange', 'Celery'];
const filteredFruits = _.difference(fruits, ['Apple', 'Banana', 'Orange']);

, что приведет к ['Celery'].

8
ответ дан Mouscellaneous 20 January 2015 в 02:15
поделиться

Используйте массив значений, с которыми вы хотите сравнить, и проверьте, чтобы возвращаемый индекс был больше -1. Это указывает на то, что оцененное значение было найдено в коллекции.

_.remove( fruits, function ( fruit ) {
  return _.indexOf( [ "Apple", "Banana", "Orange" ], fruit ) >= 0;
});

В качестве альтернативы вы можете использовать метод lo-dash _.contains для получения логического ответа.

Проблема с вашим подходом заключалась в том, что вы не сравнивали fruit с каждой из этих строк; вместо этого было выполнено единственное сравнение fruit с "Apple", после чего вы заставляли все строки самостоятельно.

Непустые строки приводят к true (!!"Banana"), и как таковые истинны . Следовательно, следующее условие всегда будет коротким замыканием в «Банане» (если fruit строго не равно "Apple"), возвращая true:

return fruit === "Apple" || 'Banana' || "Orange";
2
ответ дан Sampson 20 January 2015 в 02:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: