как вычесть значение объекта - PullRequest
0 голосов
/ 07 ноября 2018

подскажите, как вычесть значение объекта, скажем, у меня есть предмет для этого предмета и есть запас

 let theObj = {
    pants: [
       {
       color: "Pink",
       stock: 80,
       price: 30.99
       } 
           ]
    };

это просто не много значений и ключей, а как насчет того, что у объекта много данных?

для иллюстраций: если пользователь хочет купить штаны и после того, как он / она выберет то, что он / она хочет, этот объект будет вычтен тем, какой пользователь хочет купить, сколько он хочет, и будет вычтен, если другие пользователи купят эти штаны и этот цвет. пока не кончились, Я надеюсь, что это имеет смысл

Я надеюсь, что мой вопрос и иллюстрация имеют смысл для вас

let theObj = {
    pants: [
       {
       color: "Pink",
       stock: 80,
       price: 30.99
       } 
           ]
    };
    
const theData = theObj["pants"].map(e => e.stock - 1)
console.log(theData)
console.log(theObj) // nothing change when i subtact it 

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

вместо .map вы должны сделать .forEach

let theObj = {
        pants: [
           {
           color: "Pink",
           stock: 80,
           price: 30.99
           } 
               ]
        };
        
theObj["pants"].forEach(e => e.stock -= 1)
    
console.log(theObj)
0 голосов
/ 07 ноября 2018

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

let theObj = {
  pants: [{
    color: "Pink",
    stock: 80,
    price: 30.99
  }]
};

function doOp(keyName, obj) {
  for (let keys in obj) {
    // check if current value is an array
    if (Array.isArray(obj[keys])) {
      obj[keys].forEach(function(item) {
        // call the same function and pass the objecr
        doOp(keyName, item);
      })
    } else if (typeof obj[keys] === 'object' && typeof obj[keys] !== null) {
      doOp(keyName, obj[keys])
    } else if (keys === keyName) {
      obj[keys] = obj[keys] - 1
    }
  }
}

doOp('stock', theObj)
console.log(theObj)
Я ожидаю, что результат будет
let theObj = {
  pants: [{
    color: "Pink",
    stock: 79,
    price: 30.99
  }]
};
0 голосов
/ 07 ноября 2018

Вы не можете использовать MAP, поскольку он ничего не меняет. Используйте forEach или аналогичный цикл

let theObj = {
  pants: [{
    color: "Pink",
    stock: 80,
    price: 30.99
  }]
};

theObj["pants"].forEach(e => e.stock -= 1)
console.log(theObj) 

Вы, возможно, имеете в виду это?

let theObj = {
  pants: [{
    color: "Pink",
    stock: 80,
    price: 30.99
  }]
};

const purchase = { pants: { color: "Pink", quantity:2 }} // your user changes this

// this can be in a function

const item = Object.keys(purchase)[0];
theObj[item].forEach((e) => { if (e.color==purchase[item].color) e.stock -= purchase[item].quantity })
console.log(theObj)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...