Javascript: сращивание многомерного объекта

1

У меня эта структура Object/Array:

Obj = {
    "User": {
        "user1": [{
            "desc": "NG60",
            "Id": 3473631702,
            "Status": "offline"
        }],

        "user2": [{
            "desc": "somevalue",
            "Id": 963346121,
            "Status": "offline"
        },
        {
            "desc": "othervalue",  // SPLICE THIS OUT
            "Id": 963346122,      // SPLICE THIS OUT
            "Status": "offline"  // SPLICE THIS OUT
        }],

        "user3": [{
            "desc": "whatever",
            "Id": 972878784
        }]
    }
}

Я хочу отфильтровать разные значения, динамически (исправлено в этом примере), и если идентификаторов не осталось, я хочу удалить весь массив пользователя.

Например, если я хочу отфильтровать второй элемент массива user2:

 for(var users in Obj) {
     for(var Ids in Obj[users]) {
         if(Obj[users][Ids].Id == 963346122){
             Obj[users][Ids].splice(0, 1); // ERROR HERE
         }
     }
     if(Obj[users][Ids] == undefined) {
         delete Obj[users];
     }
 }

Я получаю эту ошибку:

Пользователь [пользователи] [Идентификаторы].splice(0, 1) не является функцией

Как сплайсировать только элемент массива, который я адресую, а не полный массив User2?

Теги:
object
arrays

3 ответа

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

Используйте array.prototye.filter, чтобы удалить пользователя из массива и использовать delete для удаления всего массива пользователей в случае отсутствия элемента:

var obj = {
    "User": {
        "user1": [
          {
            "desc": "NG60",
            "Id": 3473631702,
            "Status": "offline"
          }
        ],
        "user2": [
          {
            "desc": "somevalue",
            "Id": 963346121,
            "Status": "offline"
          },
          {
            "desc": "othervalue",  // SPLICE THIS OUT
            "Id": 963346122,      // SPLICE THIS OUT
            "Status": "offline"  // SPLICE THIS OUT
          }
        ],
        "user3": [
          {
            "desc": "whatever",
            "Id": 972878784
          }
        ]
      }
    };

function deleteUser(id) {
    Object.keys(obj.User).forEach(user => {
        obj.User[user] = obj.User[user].filter(u => u.Id !== id);
        if (obj.User[user].length === 0) {
            delete obj.User[user];
        }  
    });
}
deleteUser(963346121);
console.log(obj);
deleteUser(972878784);
console.log(obj);
1

Проблема: используемое сращивание указывало на строку не Object/Array. Используйте удаление, а не сращивание для удаления объекта.

Лучше для будущих фильтров:

//using same Obj:
for (i in Obj) {
    if (Obj.hasOwnProperty(i)) {
        var subObj = Obj[i];
        for (j in subObj) {
            var child = subObj[j];
            for (k in subObj[j]) {
                if(child[k].Id == 963346122){ //this user contains specified id the delete this user.
                    delete  child[k];
                }
            }
         }
    }
}
1

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

Попробуйте следующее:

let Obj = {
  "User": {
      "user1": [
        {
          "desc": "NG60",
          "Id": 3473631702,
          "Status": "offline"
        }
      ],
      "user2": [
        {
          "desc": "somevalue",
          "Id": 963346121,
          "Status": "offline"
        },
        {
          "desc": "othervalue",  // SPLICE THIS OUT
          "Id": 963346122,      // SPLICE THIS OUT
          "Status": "offline"  // SPLICE THIS OUT
        }
      ],
      "user3": [
        {
          "desc": "whatever",
          "Id": 972878784
        }
      ]
    }
  }

for(var users in Obj) {
  for(var Ids in Obj[users]) {
    for(var i=0; i<Obj[users][Ids].length;i++){
      if(Obj[users][Ids][i].Id == 963346122){
          Obj[users][Ids].splice(i, 1); // ERROR HERE
      }
    }
  }
  if(Obj[users][Ids] == undefined) {
    delete Obj[users];
  }
}

console.log(Obj);

Ещё вопросы

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