Видаліть json з іншого json

У мене є два JSON, з різною структурою, і мені потрібно видалити одну з них з іншої.

наприклад:

користувачів JSON:

{
   0: { id: 'user134', avatar: 'user222.gif' },
   1: { id: 'user043', avatar: 'user242.gif' },
   2: { id: 'user093', avatar: 'user357.gif' },
   3: { id: 'user193', avatar: 'user543.gif' }
}

Адміністратор JSON:

{
   id: 'user093',
   avatar: 'user357.gif'
}

після видалення адміністратора зі списку користувачів результат має бути таким:

{
   0: { id: 'user134', avatar: 'user222.gif' },
   1: { id: 'user043', avatar: 'user242.gif' },
   3: { id: 'user193', avatar: 'user543.gif' }
}

Я спробував використати _.pullAllBy (масив, значення, [iteratee = _. Identity]) , але він не працює зі мною!

1
JSON абсолютно не має відношення до вашого запитання.
додано Автор Brad, джерело
Чи можете ви зробити перший об'єкт масивом? оскільки клавіші є лише номерами індексів, то все простіше
додано Автор Dinosan0908, джерело
Перш за все, як казали інші, це не є правильним JSON. Крім того, я думаю, що це не правильний спосіб визначити масив об'єктів!
додано Автор SaJadJaf, джерело
Це невірний JSON.
додано Автор enxaneta, джерело

8 Відповіді

Добре, так що ви показуєте лише об'єкти JavaScript, а не JSON. Але припускаючи, що ви маєте на увазі, ви можете зробити це:

let users = {
   1: { id: 'user043', avatar: 'user242.gif' },
   2: { id: 'user093', avatar: 'user357.gif' },
   3: { id: 'user193', avatar: 'user543.gif' } 
};

delete users['2'];

користувачі тепер включатимуть об'єкти на клавішах 1 і 3.

0
додано
Чувак! Що це? Що сталося з об'єктом admin ? Ви просто вирішили видалити користувача ["2"] ??
додано Автор SaJadJaf, джерело

Можна використовувати

код>

Метод Object.values ​​() повертає масив власних значень властивостей перерахованих об'єктів даного об'єкта в тому ж порядку, що і цикл for ... in (різниця в тому, що цикл for-in перераховує властивості ланцюг прототипу).

Array.prototype.forEach ()

Метод forEach() виконує надану функцію один раз для кожного елемента масиву.

видалити оператора

Оператор видалення JavaScript видаляє властивість з об'єкта; якщо більше не зберігаються посилання на одне і те ж властивість, воно автоматично звільняється.

JSON.stringify ()

Метод JSON.stringify() перетворює значення JavaScript у рядок JSON, при необхідності замінюючи значення, якщо зазначена функція, що замінює, або необов'язково включати лише вказані властивості, якщо вказано масив-замінник.

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

var obj = {
   0: { id: 'user134', avatar: 'user222.gif' },
   1: { id: 'user043', avatar: 'user242.gif' },
   2: { id: 'user093', avatar: 'user357.gif' },
   3: { id: 'user193', avatar: 'user543.gif' }
}


var obj2 = {
   id: 'user093',
   avatar: 'user357.gif'
}
Object.values(obj).forEach(function(o,i){
  if(JSON.stringify(obj2) == JSON.stringify(o))
    delete obj[i];
});
console.log(obj);
</div> </div>

OR: If you want to check by individual key

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

var obj = {
   0: { id: 'user134', avatar: 'user222.gif' },
   1: { id: 'user043', avatar: 'user242.gif' },
   2: { id: 'user093', avatar: 'user357.gif' },
   3: { id: 'user193', avatar: 'user543.gif' }
}


var obj2 = {
   id: 'user093',
   avatar: 'user357.gif'
}
Object.values(obj).forEach(function(o,i){
  if(obj2.id == o.id && obj2.avatar == o.avatar)
    delete obj[i];
});
console.log(obj)
</div> </div>

0
додано

Можливо, ви маєте на увазі об'єкт літералу, а не JSON . Ви можете скористатися Object.keys і зменшити , щоб досягти цього:

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

const data = {
   0: { id: 'user134', avatar: 'user222.gif' },
   1: { id: 'user043', avatar: 'user242.gif' },
   2: { id: 'user093', avatar: 'user357.gif' },
   3: { id: 'user193', avatar: 'user543.gif' }
};

const admin = {
   id: 'user093',
   avatar: 'user357.gif'
};

const result = Object.keys(data).reduce((acc, currentKey) => {
  if (data[currentKey].id !== admin.id) acc[currentKey] = data[currentKey];

  return acc;
}, {});

console.log(result);
</div> </div>

0
додано
let user = {
    { id: 'user134', avatar: 'user222.gif' },
    { id: 'user043', avatar: 'user242.gif' },
    { id: 'user093', avatar: 'user357.gif' },
    { id: 'user193', avatar: 'user543.gif' }
};
let admin = {
    id: 'user093',
    avatar: 'user357.gif'
 };
let new_user=user.map(u=>{
    if(u.id!=admin.id){
        return u;
    }
});
0
додано

Залежно від вашої здатності до реструктуризації даних, існують власні методи JS для цього.

Як ви вже згадували в своїх тегах, це рішення для Vue:

Нехай користувачі є масивом об'єктів, а не об'єктом об'єктів:

data() {
    return {
      users: [
       { id: 'user134', avatar: 'user222.gif' },
       { id: 'user043', avatar: 'user242.gif' },
       { id: 'user093', avatar: 'user357.gif' },
       { id: 'user193', avatar: 'user543.gif' }
      ]
    };
  },

Потім можна написати функцію, яка має об'єкт як параметр, який буде служити виразом фільтра:

  methods: {
    filterUsers(user) {
      this.users = this.users.filter(element => {
        element.id !== user.id
      })
    }
  }

.. або використовувати обчислюване властивість для фільтрації користувачів безперервно, коли у вас є об'єкт адміністратора в змінній data (наприклад, userToFilter )

  computed: {
    filteredUsers() {
      return this.users.filter(element => {
        element.id !== this.userToFilter.id
      })
    }
  }
0
додано

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

let mainObject ={
   0: { id: 'user134', avatar: 'user222.gif' },
   1: { id: 'user043', avatar: 'user242.gif' },
   2: { id: 'user093', avatar: 'user357.gif' },
   3: { id: 'user193', avatar: 'user543.gif' }
}

let filterObject = {
   id: 'user093',
   avatar: 'user357.gif'
}

Object.values(mainObject).forEach(({id, avatar},index)=> { 
  if(id === filterObject.id) delete mainObject[index];
})
console.log(mainObject)
</div> </div>

0
додано

Ви можете зробити це так

let user = {
   0: { id: 'user134', avatar: 'user222.gif' },
   1: { id: 'user043', avatar: 'user242.gif' },
   2: { id: 'user093', avatar: 'user357.gif' },
   3: { id: 'user193', avatar: 'user543.gif' }
};

let admin = {
   id: 'user093',
   avatar: 'user357.gif'
};
for(key in user){
    if(user[key].id  === admin.id){
        delete user[key];
    }
}
0
додано

Перш за все, це не JSON, це лише об'єкт JavaScript.

Якщо ви хочете видалити об'єкт в іншому об'єкті за його полем ідентифікатора, ви можете використовувати метод for ... in , як це.

 var o = {
     0: { id: 'user134', avatar: 'user222.gif' },
     1: { id: 'user043', avatar: 'user242.gif' },
     2: { id: 'user093', avatar: 'user357.gif' },
     3: { id: 'user193', avatar: 'user543.gif' }
  }

  for (var baseKey in o) {
    if (o[baseKey].id == "user093") {
      delete o[baseKey];
      console.log(o);
    }
  }
0
додано
ІТ КПІ - JavaScript
ІТ КПІ - JavaScript
504 учасників

співтовариство javascript розробників в Telegram