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

#javascript #arrays

#javascript #массивы

Вопрос:

 const array1 = [
  {id: 1, Q_type: "AL"},
  {id: 2, Q_type: "BL"},
  {id: 3, Q_type: "CL"},
  {id: 4, Q_type: "DL"}
]
const array2 = [
  {id: 2, Q_type: "BL"},
  {id: 3, Q_type: "CL"},
  {id: 4, Q_type: "DL"}
]

const arrAfterComparison = array1.filter(val => !array2.includes(val))
 

Я пытаюсь сравнить array1 array2 и получить объект, которого нет в обоих этих массивах

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

 arrAfterComparison = [{id:1,Q_type:"AL"}]
 

Комментарии:

1. Что вы пробовали до сих пор, чтобы решить это самостоятельно?

2. @Andreas добавил мою неудачную попытку.. я перепробовал много решений, но я застрял здесь: (

3. @Phil ожидаемый вывод / вывод будет таким [{id:4,Q_type:"AL"}] или [{id:1,Q_type:"AL"}] ?

4. мой плохой .. это будет [{id:1,Q_type:"AL"}]

5. @Phil ты уверен, что там только один объект отличается?

Ответ №1:

Используйте Array.some() Array.filter() обратный вызов внутри метода.

 const array1 = [
  {id: 1, Q_type: "AL"},
  {id: 2, Q_type: "BL"},
  {id: 3, Q_type: "CL"},
  {id: 4, Q_type: "DL"}
]
const array2 = [
  {id: 2, Q_type: "BL"},
  {id: 3, Q_type: "CL"},
  {id: 1, Q_type: "DL"}
]

const output = array1.filter(item => !array2.some(a => a.Q_type === item.Q_type))
console.log(output); 

Комментарии:

1. Это решает проблему безупречно .. застрял здесь на некоторое время.. никогда не приходилось использовать some() метод, прежде чем я прочитаю docx спасибо

2. Не думаете ли вы, что где-нибудь на SO появится еще один вопрос, который уже решает эту проблему?

Ответ №2:

Когда вы сравниваете, на самом деле 2 объекта не похожи .. посмотрите внимательно (это не ошибка)

  1. Оба с id:1 имеют разные значения для Q_type
  2. Тот, у которого идентификатор 4 (мы все это видим)
 const array1 = [
  {id: 1, Q_type: "AL"},
  {id: 2, Q_type: "BL"},
  {id: 3, Q_type: "CL"},
  {id: 4, Q_type: "DL"}
]
const array2 = [
  {id: 2, Q_type: "BL"},
  {id: 3, Q_type: "CL"},
  {id: 1, Q_type: "DL"}
]

function oddIndexesOut(_arr1,_arr2){
  //objects may "look" the same but if they don't point to the same thing, they're not equal.. however if i turn it into a string, things that "look" equal are equal
  _arr1=_arr1.map(a=>JSON.stringify(a))
  _arr2=_arr2.map(a=>JSON.stringify(a))
  
  //comparison function(if things "look" similar)
  function compare(arr1,arr2){
    var x=arr1.filter(a=>!arr2.includes(a))
    return x.map(a=>JSON.parse(a))
  }
  
  //the longest array is used(so that checking can be full)
  if(_arr1.length>_arr2.length){
    return compare(_arr1,_arr2)
  }
  return compare(_arr2,_arr1)
}

console.log(oddIndexesOut(array1,array2))