как динамически изменять только некоторые свойства объекта

1

У меня есть этот объект (у которого есть намного больше свойств, чем указано здесь, имеющих разные значения):

var dbValuesObj = {
    //1. group of properties that I don't want to touch(I don't want to check the values for these)
    rebateNetSaleMinAmt1: 500,
    rebateNetSaleMaxAmt1: 400,
    rebateAmtWoProd1: 0,
    rebateAmtAllProd1: 200,
    rebateAmtOneProd1: 0,

    //2. group of properties that I want to change (I know exactly what is the list of the properties that I want to check and change their values, if they are equal to 0)
    rebateNetSaleMinAmt2: 100,
    rebateNetSaleMaxAmt2: 0,
    rebateAmtWoProd2: 300,
    rebateAmtAllProd2: 0,
    rebateAmtOneProd2: 700
}

Мне нужно изменить значения свойств объекта из пункта №2, которые имеют значение 0. Поэтому в моем случае я хочу изменить rebateNetSaleMaxAmt2 и rebateAmtAllProd2 на другое значение. Но я не хочу проверять или изменять свойства из # 1

Я попытался использовать

for(var property in dbValuesObj)

но я проверяю все свойства, и я не хочу смотреть/изменять/проверять свойства из # 1

  • 0
    У вас есть список свойств, которые вы хотите изменить, и какое должно быть их окончательное значение?
  • 1
    if (property ends with "2" and the value is zero) { ... }
Показать ещё 1 комментарий
Теги:
object
properties

4 ответа

0
Лучший ответ

Так вот как я решил свою проблему. Спасибо всем за ответы.

//Define the properties that we want to check for 0 value
    var arrayOfPropsToCheck = ["rebateNetSaleMinAmt1", "rebateNetSaleMaxAmt1", "rebateAmtWoProd1", "rebateAmtAllProd1", "rebateAmtOneProd1",
                               "rebateNetSaleMinAmt2", "rebateNetSaleMaxAmt2", "rebateAmtWoProd2", "rebateAmtAllProd2", "rebateAmtOneProd2",
                               "rebateNetSaleMinAmt3", "rebateNetSaleMaxAmt3", "rebateAmtWoProd3", "rebateAmtAllProd3", "rebateAmtOneProd3",
                               "rebateNetSaleMinAmt4", "rebateNetSaleMaxAmt4", "rebateAmtWoProd4", "rebateAmtAllProd4", "rebateAmtOneProd4",
                               "rebateNetSaleMinAmt5", "rebateNetSaleMaxAmt5", "rebateAmtWoProd5", "rebateAmtAllProd5", "rebateAmtOneProd5",
                               "rebateNetSaleMinAmt6", "rebateNetSaleMaxAmt6", "rebateAmtWoProd6", "rebateAmtAllProd6", "rebateAmtOneProd6",
                               "rebateNetSaleMinAmt7", "rebateNetSaleMaxAmt7", "rebateAmtWoProd7", "rebateAmtAllProd7", "rebateAmtOneProd7"];

    //Check the properties in the dbValuesObj object
    for (var property in dbValuesObj) {

      //Get the value for the property
      var value = dbValuesObj[property];

      //Define flag
      var isInArray = false;

      //Get the values from the arrayOfPropsToCheck
      for(var k = 0; k < arrayOfPropsToCheck.length; k++){

        //Compare if the name of the property is equal to the one found in the array and set flag to true
        if(arrayOfPropsToCheck[k] == property){
          isInArray = true;
        }
      }
      //If propery is in arrayOfPropsToCheck and has value 0 change it to empty string
      if(isInArray && value === "0"){
          dbValuesObj[property] = ""; 
      }
    }
0

Вам нужно проверить, заканчивается ли property с "2" и value свойства 0.

Чтобы получить последнее значение из строки property вы можете сделать следующее:

property[property.length-1];

Затем, чтобы получить value свойства, вы можете сделать это:

dbValuesObj[property];

Теперь, когда вы знаете, как получить требуемые компоненты, вы можете использовать оператор if в себе для цикла, чтобы проверить, соответствует ли свойство вашим требованиям (заканчивается на "2" и имеет значение 0), а затем меняет значение на все, что вы хочу, чтобы это было. (в фрагменте кода я устанавливаю его в 1)

Проверьте фрагмент кода для рабочего примера:

var dbValuesObj = {
  rebateNetSaleMinAmt1: 500,
  rebateNetSaleMaxAmt1: 400,
  rebateAmtWoProd1: 0,
  rebateAmtAllProd1: 200,
  rebateAmtOneProd1: 0,
  
  rebateNetSaleMinAmt2: 100,
  rebateNetSaleMaxAmt2: 0,
  rebateAmtWoProd2: 300,
  rebateAmtAllProd2: 0,
  rebateAmtOneProd2: 700
}

for (var property in dbValuesObj) {
  var value = dbValuesObj[property];
  if (property[property.length - 1] === "2" && value === 0) {
    dbValuesObj[property] = 1; // Change the value to a new value (ie 1)
  }
}

console.log(dbValuesObj);
0

Мне нужно изменить значения свойств объекта из пункта №2, которые имеют значение 0. Поэтому в моем случае я хочу изменить rebateNetSaleMaxAmt2 и rebateAmtAllProd2 на другое значение.

Вы можете сначала отфильтровать их

var requiredKeys = Object.keys( dbValuesObj ).filter( k => k.slice(-1) == "2" && dbValuesObj[k] == 0 );

Теперь вы можете выполнить итерацию этого requiredKeys массива Keys

requiredKeys.forEach( function( key ){
   console.log( key, dbValuesObj[key]  )
})

Для данных, которые вы предоставили, он распечатает

"rebateNetSaleMaxAmt2" 0

"rebateAmtAllProd2" 0

0
function updateGroup(obj, defaultValue, grpNum) {
  for(prop in obj ) {
   var index = parseInt(prop.match(/\d+$/)[0]);

   if(index === grpNum && obj[prop] === 0) {
    obj[prop] = defaultValue;
   } 
   if(index > grpNum) { // if properties are in number order. else remove this.
    return;
  }}

  return; 
}

updateGroup(dbValuesObj, 100, 2);

Вы можете попробовать это, указав groupNumber и defaultValue, что вам нужно установить для 0 в этой группе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню