Я часто использую Array.prototype.filter
и я ожидаю, что один единственный элемент будет правдивым.
Поскольку фильтр возвращает массив результатов, мне нужно всегда обращаться к этому элементу, поэтому я делаю что-то вроде
knownRefundLogics.filter((refundLogic) => this.hasTag(refundLogic.underscoredName))[0]
Предположим, что:
knownRefundLogics = [{
"underscoredName": "express_full_refund",
"camelized": "expressFullRefund"
}, {
"underscoredName": "express_partial_refund",
"camelized": "expressPartialRefund"
}, {
"underscoredName": "express_no_refund",
"camelized": "expressNoRefund"
}]
и hasTag()
- метод, который includes()
в массив для элемента refundLogic
.
Есть ли более подходящий метод для этого, например, с помощью оператора распространения?
Кстати, я знаю, что могу потенциально разбить свои методы таким образом, чтобы возвращалось только true
или false
значение, но я нахожу это немного переработанным решением.
Вы можете использовать функцию поиска Array #, которая возвращает первый элемент, который передает данное условие. Кроме того, filter
быстрее, потому что filter
выполняет итерацию по всем элементам, а затем вы получаете только первый. find
находит первый согласованный элемент и разбивает цикл.
В примере, который вы видите, он выполняет итерацию 2 раза вместо 3.
const knownRefundLogics = [{
"underscoredName": "express_full_refund",
"camelized": "expressFullRefund"
}, {
"underscoredName": "express_partial_refund",
"camelized": "expressPartialRefund"
}, {
"underscoredName": "express_no_refund",
"camelized": "expressNoRefund"
}];
const foundItem = knownRefundLogics.find(item => {
console.log('Iteration');
return item.camelized === 'expressPartialRefund';
});
console.log(foundItem);
Вместо этого используйте Array # find() - всякий раз, когда предикат возвращает true
, итерация прекращается, и соответствующий элемент (а не массив) возвращается немедленно:
const knownRefundLogics = [{"underscoredName":"express_full_refund","camelized":"expressFullRefund"},{"underscoredName":"express_partial_refund","camelized":"expressPartialRefund"},{"underscoredName":"express_no_refund","camelized":"expressNoRefund"}];
const demoHasTag = (t) => t === 'express_partial_refund';
const result = knownRefundLogics.find((refundLogic) => demoHasTag(refundLogic.underscoredName));
console.log(result);
Если вы хотите решение без полифайла, старый добрый цикл - ваш друг.
var knownRefundLogics = [{
"underscoredName": "express_full_refund",
"camelized": "expressFullRefund"
}, {
"underscoredName": "express_partial_refund",
"camelized": "expressPartialRefund"
}, {
"underscoredName": "express_no_refund",
"camelized": "expressNoRefund"
}];
var selected;
for(var i = 0; i < knownRefundLogics.length; i++){
let current = knownRefundLogics[i];
if(current.underscoredName === 'express_partial_refund'){
selected = current;
break;
}
}
console.log(selected);
С этим вы можете написать свой собственный легкий полиполк.
function findInArray(array, test){
for(var i = 0; i < array.length; i++){
if(test(array[i], i, array)) return array[i];
}
}
var knownRefundLogics = [{
"underscoredName": "express_full_refund",
"camelized": "expressFullRefund"
}, {
"underscoredName": "express_partial_refund",
"camelized": "expressPartialRefund"
}, {
"underscoredName": "express_no_refund",
"camelized": "expressNoRefund"
}];
console.log(findInArray(knownRefundLogics, function(item, index, array){
return item.underscoredName === "express_partial_refund";
}));
Array.prototype.some()
,Array.prototype.every()