В этих примерах используется набор данных из исходного вопроса, но logi c все еще обозначает обновленный вопрос.
В зависимости от желаемого результата, вы можете получить разницу между массивами, например так:
const result = _.differenceWith(array1, array2, _.isEqual);
Это выдаст
{ id: 1010, name: "grapes" }
Если вам нужна разница в симметрии c, вы можете также объединить противоположное:
const result = _.differenceWith(array1, array2, _.isEqual).concat(_.differenceWith(array2, array1, _.isEqual));
Это даст вам
{ id: 1010, name: "grapes" }
{ id: 1010, name: "apple" }
{ id: 3030, name: "banana" }
Результат, который вы процитировали в своем вопросе, немного отличается, он не является ни разницей, ни симметрией c разницы, если вы хотите получить только один результат для каждого идентификатора, вам нужно будет удалить второй случай любой объект с идентификатором ключа, который уже существует, например:
result = result.filter((elm, i) => !result.find((elm2, j) => elm.id === elm2.id && i > j) );
, который даст вам
{ id: 1010, name: "grapes" }
{ id: 3030, name: "banana" }