Удалить 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(array, values, [iteratee=_.identity]), но у меня это не работает!

Это недопустимый JSON.

enxaneta 09.10.2018 16:31

Можете ли вы сделать первый объект массивом? поскольку ключи - это просто номера индексов, это упрощает все

Dinosan0908 09.10.2018 16:32

JSON не имеет абсолютно никакого отношения к вашему вопросу.

Brad 09.10.2018 16:34

Во-первых, как говорили другие, это недействительный JSON. Кроме того, я считаю, что это неправильный способ определения массива объектов!

Spleen 09.10.2018 16:36

@SajadJafari Еще лучше Set, но Vue.js не поддерживает эти структуры.

Brad 09.10.2018 17:05
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
5
334
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Итак, то, что вы показываете, - это просто объекты 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.

Чувак! Что это? Что случилось с объектом admin? Вы только что решили удалить user["2"] ??

Spleen 09.10.2018 16:40

Вы можете сделать это так

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];
    }
}

Вы, наверное, имеете в виду литерал объекта, а не JSON. Для этого можно использовать Object.keys и уменьшать:

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.info(result);

Во-первых, это не JSON, это просто объект JavaScript.

Если вы хотите удалить объект внутри другого объекта по его полю id, вы можете использовать такой метод 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.info(o);
    }
  }
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;
    }
});
Ответ принят как подходящий

Вы можете использовать

Object.values()

The Object.values() method returns an array of a given object's own enumerable property values, in the same order as that provided by a for...in loop (the difference being that a for-in loop enumerates properties in the prototype chain as well).

Array.prototype.forEach()

The forEach() method executes a provided function once for each array element.

оператор удаления

The JavaScript delete operator removes a property from an object; if no more references to the same property are held, it is eventually released automatically.

JSON.stringify ()

The JSON.stringify() method converts a JavaScript value to a JSON string, optionally replacing values if a replacer function is specified or optionally including only the specified properties if a replacer array is specified.

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.info(obj);

ИЛИ: Если вы хотите проверить по индивидуальному ключу

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.info(obj)

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.info(mainObject)

Другие вопросы по теме