Метод фильтра JavaScript - вернуть только первый объект

Можно ли с помощью метода filter () в JavaScript вернуть только первый экземпляр, прошедший проверку? Как только я найду первый объект в своем массиве cars, я хочу переместить этот объект из его текущей позиции в начало массива cars.

Код:

     cars.filter(function(car) {

        var fareType = car.data("fareType");
        var partnerCode = car.data("partnerCode");

        if (fareType == "DEAL" && partnerCode == "AV")
        {
            // get first instance only and move element to beginning of array
        }

        if (fareType == "DEAL" && partnerCode == "BU")
        {
            // also get first instance where partnerCode == BU only and move element to beginning of array 
           // If dataPrice is less than dataPrice for partner AV, move to first position, else move to second position
        }
    });

@OriDrori findIndex лучше, так как ему нужен индекс, а не только значение.

Barmar 24.04.2018 22:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
4 091
4

Ответы 4

Я бы использовал .findIndex и .splice:

let index = cars.findIndex(function(car) {
    var fareType = car.data("fareType");
    var partnerCode = car.data("partnerCode");
    return (fareType == "DEAL" && partnerCode == "AV");
});
if (index !== -1) {
    let car = cars[index];
    cars.splice(index, 1);
    cars.unshift(car);
    /*
     * this could be reduced to:
     *
     *     cars.unshift(...cars.splice(index, 1));
     *
     * at the sake of clarity
     */
}

index = cars.findIndex(function(car) {
    return fareType == "DEAL" && partnerCode == "BU";
});
if (index !== -1) {
    let car = cars[index];
    cars.splice(index, 1);
    if (car.data('price') < cars[0].data('price')) {
        cars.unshift(car);
    } else {
        cars.splice(1, 0, car);
    }
}

Спасибо, Дэйв! Я только что обновил свой вопрос, добавив продолжение. После того, как я получу firstPosition AV Deal, мне также нужно найти элемент, где partnerCode == BU. В зависимости от того, какая цена дешевле (AV или BU), мне придется либо переместить ее на первую, либо на вторую позицию (перед AV или наоборот). Могу ли я добиться этого с помощью findIndex? Придется ли мне в этом случае использовать более одного findIndex?

Michael 24.04.2018 22:55

вы можете просто запустить практически тот же код еще раз, но с проверкой, чтобы увидеть, куда его вставить. см править

dave 24.04.2018 23:00

Круто, это прекрасно. Спасибо! :)

Michael 24.04.2018 23:06

Можно использовать findIndex()

var selectedIndex = cars.findIndex(function(car) {
    return car.data("fareType")== "DEAL" && car.data("partnerCode")== "AV";
});

if (selectedIndex > -1) {
   cars = [cars[selectedIndex], ...cars.slice(0, selectedIndex), ...cars.slice(selectedIndex + 1)
}

В случае, если это имеет значение, это создает новый массив, а не изменяет исходный массив cars.

Barmar 24.04.2018 22:48

Вы можете сделать что-то вроде:

let indexToGoFirst = 0;

cars.some((car, index) => {
  const fareType = car.data('fareType');
  const partnerCode = car.data('partnerCode');

  if (fareType == 'DEAL' && partnerCode == 'AV') {
    indexToGoFirst = index;
    return True
  }
})

cars[0] = cars[indexToGoFirst];

.some() проверяет, соответствует ли что-либо в массиве условию, и прекращает цикл, когда условие выполняется, поэтому вы можете использовать это для установки первого элемента.

Найдите индекс и сначала создайте новый массив с элементом

var index = cars.findIndex(function(car) {
        var fareType = car.data("fareType");
        var partnerCode = car.data("partnerCode");

        // get first instance only and move element to beginning of array

        return fareType == "DEAL" && partnerCode == "AV";

    });

var newCars = index > 0? [cars[index]].concat(cars.slice(0, index)).concat(cars.slice(index + 1): cars; 

Другие вопросы по теме