Эффективно получить доступ к возврату отдельного элемента Array.prorotype.filter

1

Я часто использую 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 значение, но я нахожу это немного переработанным решением.

  • 0
    Array.prototype.some() , Array.prototype.every()
  • 0
    Вы можете использовать Array.prototype.reduce () , он гарантированно вернет одно значение
Показать ещё 2 комментария
Теги:
arrays

3 ответа

1
Лучший ответ

Вы можете использовать функцию поиска 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);
  • 0
    проблема с .find в том, что вам нужно использовать полифилл, но я приму ответ, поскольку я не указал это в своем вопросе.
2

Вместо этого используйте 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);
0

Если вы хотите решение без полифайла, старый добрый цикл - ваш друг.

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";
}));
  • 0
    или. для каждого я думаю? Я до сих пор не слышал никаких мнений по поводу автоматического получения первого и единственного элемента функции фильтра
  • 0
    Нет. В отличие от простого цикла, вы не можете прерывать цикл forEach.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню