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

Я пытаюсь удалить свойство из объектов, которые присутствуют в массиве .Фактически в моих объектах каждый объект содержит свойство shortkeys.Мне нужно удалить shortkeysсвойство только тогда, когда его нет в данном объекте .Другими словами

У меня есть один данный объект

var obj ={
  alt+c:"alt+c"
  alt+g:"alt+g"
}

Мне нужно удалить shortkeyсвойство из объекта, только если его нет в данном ключе объекта .

Я пытался, как это

var arr=[
  {name:"abc",shortkeys:"alt+m"},
  {name:"abc",shortkeys:"alt+a"},
  {name:"abc",shortkeys:"alt+c"},
  {name:"abc",shortkeys:"alt+f"},
  {name:"abc",shortkeys:"alt+g"}
]
var obj ={
  alt+c:"alt+c"
  alt+g:"alt+g"
}

for (var i=0;i<arr.length;i++){
  var o =arr[i];
  for(key in obj){
    if(o.shortkeys !=key){
      delete o.shortkeys;
    }
  }
}

Ожидаемый результат

var expectedArr=[
  {name:"abc"},
  {name:"abc"},
  {name:"abc",shortkeys:"alt+c"},
  {name:"abc"},
  {name:"abc",shortkeys:"alt+g"}
]

Играть на скрипке
https://jsfiddle.net/5134enew/1/

Обновление :

Удалить из всех объектов
https://jsfiddle.net/5134enew/2/

2 ответа

  1. Кроме синтаксической ошибки, ваш код проверяет, существует ли ключ, который не является коротким ключом, вместо того, чтобы проверять, находится ли короткий ключ в списке, который вы хотите проверить. alt+cпроверяетсяalt+g, и таким образом удаляется. Вы хотите предотвратить удаление, когда он будет найден.

    Поэтому вместо того, чтобы делать следующее…

      for(key in obj){
        if(o.shortkeys !=key){
          delete o.shortkeys;
        }
      }
    

    …вы бы сделали это вместо этого.

      var match = false;
      for (key in obj) {
        if (o.shortkeys == key) {
          match = true;
          break;
        }
      }
      if (!match) {
        delete o.shortkeys;
      }
    

    Это можно сократить до простой x in yпроверки, как предложил @Mark Leiber. Вы должны понимать, что удаление происходит после проверки всех ключей, вместо того, чтобы удалять всякий раз, когда мы сталкиваемся с ключом, который не соответствует.

    var arr = [{
      name: "abc",
      shortkeys: "alt+m"
    }, {
      name: "abc",
      shortkeys: "alt+a"
    }, {
      name: "abc",
      shortkeys: "alt+c"
    }, {
      name: "abc",
      shortkeys: "alt+f"
    }, {
      name: "abc",
      shortkeys: "alt+g"
    }]
    var obj = {
      "alt+c": "alt+c",
      "alt+g": "alt+g"
    }
    
    for (var i = 0; i < arr.length; i++) {
      var o = arr[i];
    
      if(!(o.shortkeys in obj)) {
        delete o.shortkeys;
      }
    }
    
    console.log(arr);

  2. Как сказано выше, ваш код удаляет короткие клавиши, когда он не совпадает с ключами в obj. So (o .короткие клавиши) «alt+m»!==(клавиша) «alt+c» — > следовательно, удалить o.короткие клавиши.И затем снова идет для проверки (shortkey, который уже был удален так o.shortkeys is undefined) ie » undefined != alt+g», который не имеет смысла и снова пытается удалить o.shorkeys ie undefined который не имеет никакого значения.
    Я написал более подробный код, похожий на приведенный выше.
    пожалуйста, проверьте скрипку : jsfiddle.net/som99/d37ws7r6/2/

    Пояснения даются в комментариях.Проверьте консоль для вывода.