Работа с одним из объектов в массиве на основе поля - PullRequest
0 голосов
/ 05 февраля 2020

Имейте объект с вышеупомянутой структурой. С этим объектом мне нужно манипулировать одним из объектов, присутствующих в массиве объектов "prop21".

let obj = {
    prop: {
        prop21: [
            {
                field: "val1",
                value1: "val2"
            }
        ]
    }
}

Следующий сценарий ios:

Всякий раз, когда я передаю «ack» в функцию

1) Мне нужно создать объект в формате {field: " ack ", value: true} и pu sh в массив prop21 в случае отсутствия объекта с {field:" ack ", value: true}.

2) В случае {field: «ack», значение: false} присутствовало, преобразовать значение в true

Когда я передаю «unack» в функцию

1) Мне нужно создать объект в формате {field: " ack ", value: false} и pu sh в массив prop21 в случае отсутствия объекта с {field:" ack ", value: false}.

2) В случае {field: «ack», значение: true} присутствовало, преобразовать значение в false

Когда я передаю «all» в функцию

Это должно в основном удалить объект {field: «ack», значение: true} или {field: «ack», значение: false}, если присутствует

function manipulate(val) {

    let newObj = { field: "ack", operator: "=", value: true }
    if (value === "ack") {
        // change the "value" field of object with field:"ack" to true if its present, else create a new one with format of "newObj" with value true and push it
    }
    else if (value === "unack") {
        // change the "value" field of object with field:"ack" to false if its present, else create a new one with format of "newObj" with valye false and push it
    }
    else {
        //this is case for value === "all" , hence remove the object with field with value "ack"
    }
}

Ответы [ 4 ]

1 голос
/ 05 февраля 2020

Вы могли бы пойти прямым путем, ища объект и используя switch для типов обновления.

function change(array, type) {
    var index = array.findIndex(({ field }) => field === 'ack'),
        temp = array[index] || { field: "ack", value: type === "ack" };

    switch (type) {
        case 'ack':
        case 'unack':
            if (index !== -1) temp.value = type === "ack";
            else array.push(temp);
            break;
        case 'all':
            if (index !== -1) array.splice(index, 1);
    }
}

let obj = { prop: { prop21: [{ field: "val1", value1: "val2" }] } };

change(obj.prop.prop21, 'ack');
console.log(obj.prop.prop21);

change(obj.prop.prop21, 'unack');
console.log(obj.prop.prop21);

change(obj.prop.prop21, 'ack');
console.log(obj.prop.prop21);

change(obj.prop.prop21, 'all');
console.log(obj.prop.prop21);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 05 февраля 2020

Комментарии добавлены в сам код для объяснения. Надеюсь, это поможет.

let obj = {
  prop: {
    prop21: [
      {
        field: "val1",
        value1: "val2"
      }
    ]
  }
};

function manipulate(val) {
  // value = true for ack and false for unack.
  const newObj = { field: "ack", value: val === "ack" };
  // first remove field: ack for all val cases ack, unack, all.
  obj.prop.prop21 = obj.prop.prop21.filter(prop => !prop.field.includes("ack"));
  // ack and unack will contain 'ack', so checking for ack.
  if (val.includes("ack")) {
    // add it for ack/unack cases.
    obj.prop.prop21.push(newObj);
  }
}

manipulate("ack");
console.log(obj);
manipulate("unack");
console.log(obj);
manipulate("all");
console.log(obj);
1 голос
/ 05 февраля 2020

let obj = {
  prop: {
    prop21: [{
      field: "val1",
      value1: "val2"
    }]
  }
}


function manipulate(value) {
  let newObj = {
    field: "ack",
    operator: "=",
    value: true
  }
  let isAck = false;
  let index = -1;
  
  let myarr = obj.prop.prop21;
  for(let i =0;i< myarr.length;i++){
  	if (myarr[i].field === 'ack') {
      isAck = true;
      index = i;
      break;
    }
  }
  if (value === "ack") {

    if (isAck) {
      let prop21obj = obj.prop.prop21[index];
      obj.prop.prop21[index] = Object.assign(prop21obj, newObj);
    } else {
      obj.prop.prop21.push(newObj);
    }
    // change the "value" field of object with field:"ack" to true if its present, else create a new one with format of "newObj" with value true and push it
  } else if (value === "unack") {


    newobj[value] = false;

    if (isAck) {
      let prop21obj = obj.prop.prop21[index];

      obj.prop.prop21[index] = Object.assign(prop21obj, newObj);
    } else {
      obj.prop.prop21.push(newObj);
    }

    // change the "value" field of object with field:"ack" to false if its present, else create a new one with format of "newObj" with valye false and push it
  } else {

    if (isAck) {

      obj.prop.prop21.splice(index, 1);
    }
    //this is case for value === "all" , hence remove the object with field with value "ack"
  }
}

manipulate('ack');
console.log(obj);
1 голос
/ 05 февраля 2020

Достаточно просто. Объяснение в комментариях

let obj = {
    prop: {
        prop21: [
            {
                field: "val1",
                value1: "val2"
            },
            {
                "field": "ack",
                "operator": "=",
                "value": null
            }
        ]
    }
}

function manipulate(value) {
    const newobj = { field: "ack", operator: "=", value: false };
    if (value === "ack") toggleAck(newobj, true);
    else if (value === "unack") toggleAck(newobj, false);
    else removeAck();
}

function toggleAck(newobj, val) {
    newobj.value = val; //modify value of new ack object based on ack/unack
    const ackItem = obj.prop.prop21.find(i => i.field == "ack"); //look for object with ack field
    if (ackItem) ackItem.value = val; //if exists, change this object value
    else obj.prop.prop21.push(newobj); //else, push new obj from template
}

function removeAck() {
    const ackItemIdx = obj.prop.prop21.findIndex(i => i.field == "ack");  //look for object with ack field
    obj.prop.prop21.splice(ackItemIdx, 1); //remove item from array
}

manipulate("ack");
console.log(obj.prop.prop21);
manipulate("unack");
console.log(obj.prop.prop21);
manipulate("all");
console.log(obj.prop.prop21);

Я сделал отдельные функции, чтобы их было легче читать. Вы можете оптимизировать / реорганизовать это под ваши ставки

...