#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 объекта не похожи .. посмотрите внимательно (это не ошибка)
- Оба с
id:1
имеют разные значения дляQ_type
- Тот, у которого идентификатор 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))