#javascript #object
Вопрос:
Я пытаюсь вычесть ту же сумму, полученную в приведенном ниже рабочем коде, из каждого значения ключа в объекте x, переданном моей функции, а затем вернуть обновленный объект, чтобы мы передали
splitTheBill({A: 20, B: 15, C: 10})
к функции, и мы должны возвращать {A: 5, B: 0, C: -5}
в качестве новых значений объекта.
Я думаю, что мне нужен цикл for для перебора моего объекта, выполняющего вычитание суммы, которую следует заплатить, каждую итерацию, но теперь я уверен, как этого добиться в Javascript. Помощь очень признательна ТИА.
function splitTheBill(x) {
let toPayObject = {};
let counter = 0;
let total = 0;
function sum(obj) {
var sum = 0;
for (var el in x) {
if (x.hasOwnProperty(el)) {
sum = parseInt(x[el]);
}
}
return sum;
}
let amountPaid = sum(x);
let shouldPay = amountPaid / 3;
console.log("Amount Paid £" amountPaid " Each person should pay:£" shouldPay);
return x;
}
Комментарии:
1. Это школьное задание?
2. Lol нет, это решение для ката с кодовыми войнами, над которым я работаю, попробуйте попасть на загрузочный лагерь javascript, lol
3. не забудьте отметить ответ как принятый.
Ответ №1:
ВАЖНО: Прокрутите страницу вниз для поиска «предполагаемого» решения.
Если я правильно понимаю ваш вопрос (он сформулирован немного странно, также представленный пример кажется немного странным), вы хотите суммировать значения ключей вашего объекта, разделить его на количество ключей и вернуть значения. Т. е. суммировать платеж, разделить его на количество получателей.
ES6 (или ES2015) сделал это невероятно плавным благодаря:
- используя метод Object.values(obj), возвращающий массив перечислимых ключей.
- использование метода array.reduce для суммирования значений.
Затем остается разделить его на длину массива (которая равна количеству ключей в объекте).
JS, используя синтаксис ES6:
const sum = (bill) => {
return Object.values(bill).reduce((a, b) => a b);
};
const splitTheBill = (bill) => {
return sum(bill) / Object.keys(bill).length;
};
const payees = {
A: 20,
B: 15,
C: 10,
};
console.log(`Amount Paid £ ${sum(payees)}. Each person should pay: £ ${splitTheBill(payees)}.`);
Отрывок:
const sum = (bill) => {
return Object.values(bill).reduce((a, b) => a b);
};
const splitTheBill = (bill) => {
return sum(bill) / Object.keys(bill).length;
};
const payees = {
A: 20,
B: 15,
C: 10,
};
console.log(`Amount Paid £ ${sum(payees)}. Each person should pay: £ ${splitTheBill(payees)}.`);
Правка: стало ясно, что вы намерены вычесть среднее значение из платежа каждого человека.
Объектом можно управлять, получая доступ к ключам и присваивая новые значения. Во-первых, нам нужно знать, что это за ключи. Для этого у нас есть Object.keys
метод, который возвращает массив. Поскольку мы уже знаем, как получить массив объекта , мы можем выполнить a forEach
, предоставить индекс, получить нужный ключ, использовать его в качестве индекса исходного объекта, а затем повторно присвоить значение.
JS, используя синтаксис ES6:
const sum = (bill) => {
return Object.values(bill).reduce((a, b) => a b); // here we convert the object to an array, sum the values and return the result.
};
const splitTheBill = (bill) => {
return sum(bill) / Object.keys(bill).length; // Here we divide the sum by the length of the object array. The length is equal to the number of keys in the object.
};
const subtractEqually = (bill) => {
const splitValue = splitTheBill(bill); // How much each person should pay.
const keys = Object.keys(bill); // Here we return an array with the keys of the original object.
/*!
* Loop through the object array, with the optional index parameter being provided.
* The forEach loop takes 2 parameters, the second one being the index.
!*/
Object.values(bill).forEach((payment, index) => {
/*!
* Access the original object through its keys.
* Since we have an array, containing the key names of the original object,
* we can use the index value from our forEach as our pointer to each key name
* as we iterate through the object array.
* For instance, the keys array is equal to ["A", "B", "C"].
* index 0 = "A", index 1 = "B", index 2 = "C". This is normal array indexing logic.
* The original object, payees, has the key names that corresponds to what we have in the keys array.
* For instance, payees["A"] will give us the object value for key "A".
* So what we're doing in the end here, is simply accessing each key on the original object
* E.g. payees["A"] will give us access to the value of key "A" in the object.
* We can then assign this index to a new value, which is the original value minus the value we need to subtract.
!*/
payees[keys[index]] = payees[keys[index]] - splitValue;
});
return payees; // Return the object with the re-assigned values.
}
let payees = {
A: 20,
B: 15,
C: 10,
};
console.log(`Amount Paid £ ${sum(payees)}. Each person should pay: £ ${splitTheBill(payees)}.`);
console.log(subtractEqually(payees));
Отрывок:
const sum = (bill) => {
return Object.values(bill).reduce((a, b) => a b);
};
const splitTheBill = (bill) => {
return sum(bill) / Object.keys(bill).length;
};
const subtractEqually = (bill) => {
const splitValue = splitTheBill(bill);
const keys = Object.keys(bill);
Object.values(bill).forEach((payment, index) => {
payees[keys[index]] = payees[keys[index]] - splitValue;
});
return payees;
}
let payees = {
A: 20,
B: 15,
C: 10,
};
console.log(`Amount Paid £ ${sum(payees)}. Each person should pay: £ ${splitTheBill(payees)}.`);
console.log(subtractEqually(payees));
Комментарии:
1. Спасибо, Мартин, это круто, но теперь мне нужно найти способ вычесть одно и то же значение из каждого ключа в объекте, а затем вернуть новый объект с новыми обновленными значениями. Любые идеи 💡
2. @JonathanJoseph Ах, теперь я понимаю. Взгляните на правку. Это должно быть то, что вы ищете (ожидаемое решение внизу).
3. Это выглядит потрясающе, я новичок в Javascript, поэтому я не хочу просто копировать и вставлять код lol. Есть ли возможность отправить мне быстрый комментарий в одну строку к каждому фрагменту вашего кода, чтобы я мог расширить свои знания, тиа с уважением, Джон
4. @JonathanJoseph Я дал несколько объяснений относительно того, что происходит. Если вам нужна дополнительная информация о том, что делает каждый метод, то
reduce
есть метод, вы всегда можете посмотреть его в MDN. У них есть отличные документы и объяснение каждого метода, который я привел в этом примере. Если бы я сам дал какие-либо дальнейшие объяснения, это было бы просто скопировать вставку из MDN, что довольно избыточно, если вы меня спросите. В конце концов, они уже проделали большую работу по объяснению этого.5. Спасибо, Мартин, большое спасибо, приятного вечера 👍