Есть более простой способ, есть таблица ссылок, например:
Таблица 1: клиенты, информация о клиенте, бла-бла-бла
Таблица 2: курсы, информация о курсе, бла-бла
Таблица 3: clientid, courseid
Затем выполните JOIN, и вы отправитесь на гонки.
Поскольку, когда 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 и фактически является распространенной ошибкой (например, этот вопрос )
Проблема не в 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
Вы можете использовать метод _.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>
Если вы хотите удалить набор элементов из другого набора, существуют определенные операции, предназначенные специально для этого. 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']
.
Используйте массив значений, с которыми вы хотите сравнить, и проверьте, чтобы возвращаемый индекс был больше -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";