#javascript #arrays #algorithm
Вопрос:
В настоящее время я пытаюсь суммировать некоторые значения в массиве объектов на основе идентификатора другого массива, присутствующего в текущем массиве. предполагая, что у меня есть этот массив
const queryArray = [ "1" , "2" ]
и это массив, который я хотел бы суммировать, если значения свойств идентификатора сборов совпадают
const services = [
{
Id: "1",
services: "Early Check-In",
fees: "7500"
},
{
Id: "2",
services: "Late Checkout",
fees: "7500"
},
{
Id: "3",
services: "Airport Chauffeur",
fees: "25000"
}
]
поэтому я хотел бы получить сумму значений свойств сборов в массиве услуг здесь на основе идентификатора, доступного в массиве запросов. так что в данном случае
[ "1" , "2" ]
должен вернуться
15000
если бы я решил использовать это ниже
[ "1" , "3" ]
он должен вернуться
32500
и если тоже есть
[ "1", "2" , "3"]
он должен вернуться
40000
Я новичок в javascript, поэтому я даже не могу придумать никакого возможного решения или шага, который нужно предпринять вообще.
Ответ №1:
Конечно, filter
услуги, которые вам нужны -> > map
услуга по ее значению -> > reduce
результирующий список с опаленным номером, добавляющим элементы:
const services = [
{
Id: "1",
services: "Early Check-In",
fees: "7500"
},
{
Id: "2",
services: "Late Checkout",
fees: "7500"
},
{
Id: "3",
services: "Airport Chauffeur",
fees: "25000"
}
]
const ids = ["1" , "2"]
console.log(
services
.filter(({Id}) => ids.includes(Id))
.map(({fees}) => parseFloat(fees))
.reduce((acc, fees) => acc fees, 0)
)
Комментарии:
1. спасибо, что все работает так, как ожидалось, я просто надеюсь, что в будущем у меня тоже будут такие знания. Еще раз спасибо
2. @Temitayo конечно, самое лучшее в массиве JS-это то, что вы можете делать с ними некоторые «функциональные» вещи, и поэтому вы можете буквально думать, что вы хотите делать шаг за шагом
3. не могли бы вы, пожалуйста, исправить код, если массив пуст, редуктор продолжает отмечать ошибку, если массив пуст
4. @Temitayo как сказал Скотта, вы можете добавить
, 0
параметр редуктора, чтобы использовать его в качестве начального значения, я немедленно исправлю код
Ответ №2:
Проверьте, включен ли идентификатор в массив идентификаторов внутри редуктора:
const services = [
{
Id: "1",
services: "Early Check-In",
fees: "7500"
},
{
Id: "2",
services: "Late Checkout",
fees: "7500"
},
{
Id: "3",
services: "Airport Chauffeur",
fees: "25000"
}
]
const queryArray = [ "1" , "2" ]
const res = services.reduce((a,b) => queryArray.includes(b.Id) ? a = b.fees : a, 0)
console.log(res)
Ответ №3:
Вы также можете использовать reduce и для каждой записи проверять, есть ли идентификатор текущего значения в массиве запросов. Если это так, то верните текущую общую сумму плюс текущие сборы.
Установите 0 в качестве начального значения.
const services = [{
Id: "1",
services: "Early Check-In",
fees: "7500"
},
{
Id: "2",
services: "Late Checkout",
fees: "7500"
},
{
Id: "3",
services: "Airport Chauffeur",
fees: "25000"
}
]
const queryArray = ["1", "2"]
let res = services.reduce(
(total, curr) => queryArray.includes(curr.Id) ? total parseInt(curr.fees, 10) : total,
0
);
console.log(res);