Как вычесть из элементов объекта с помощью цикла в Javascript

#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) сделал это невероятно плавным благодаря:

  1. используя метод Object.values(obj), возвращающий массив перечислимых ключей.
  2. использование метода 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. Спасибо, Мартин, большое спасибо, приятного вечера 👍