Можно ли с помощью метода 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
}
});



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я бы использовал .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?
вы можете просто запустить практически тот же код еще раз, но с проверкой, чтобы увидеть, куда его вставить. см править
Круто, это прекрасно. Спасибо! :)
Можно использовать 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.
Вы можете сделать что-то вроде:
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;
@OriDrori
findIndexлучше, так как ему нужен индекс, а не только значение.