#javascript #arrays #object #data-structures #comparison
#javascript #массивы #объект #структуры данных #сравнение
Вопрос:
у меня есть два массива следующим образом
array1 = {name:"John",surname:"doe",reference:[{name:"jane",surname:"smith",array:[{name:"test",surname:"test",position:12}]},{name:"kate",surname:"post",array:[{name:"test",surname:"test",position:12}]}],id:"12364",weight:"50",Oid:"456978",code:"12"}
array2 = {name:"John",surname:"doe",reference:[{name:"jane",surname:"smith,array:[{name:"test",surname:"test",position:12}]"},{name:"kate",surname:"post",array:[{name:"test",surname:"test",position:12}]}],id:"4589632",weight:50,policy:"745896",result:"test",documents:"no",launch:"no"}
как вы можете видеть, обе мои длины массивов не совпадают, поэтому я не могу сравнить их оба.
Я хотел бы сравнить только определенные объекты из массива 1 и массива 2. например, только те объекты, которые мне нужны
array1
name:"John"
surname:"doe"
reference:[{name:"jane",surname:"smith",array:[{name:"test",surname:"test",position:12}]},{name:"kate",surname:"post",array:[{name:"test",surname:"test",position:12}]}]
weight:"50"
array 2
name:"John"
surname:"doe"
reference:[{name:"jane",surname:"smith",array:[{name:"test",surname:"test",position:12}]},{name:"kate",surname:"post",array:[{name:"test",surname:"test",position:12}]}]
weight:50
я только хочу сравнить значения ключей вышеуказанных объектов, чтобы приведенное выше значение возвращало true
если бы у меня было
array1
name:"John"
surname:"doe"
reference:[{name:"jane",surname:"smith",array:[{name:"test",surname:"test",position:12}]},{name:"kate",surname:"post",array:[{name:"test",surname:"test",position:12}]}]
weight:"12"
array 2
name:"John"
surname:"Petter"
reference:[{name:"jane",surname:"smith",array:[{name:"test",surname:"t2",position:12}]},{name:"kate",surname:"Knight",array:[{name:"test",surname:"test",position:14}]}]
weight:50
приведенное выше было бы ложным.
как я могу этого добиться? как я могу фильтровать / перебирать их, чтобы сравнивать только вышеупомянутые значения.
Комментарии:
1. Есть ли причина, по которой вес иногда является числом, а иногда строкой?
2. когда массив 2 возвращается из базы данных, он возвращается как число, а массив 1 возвращается от пользователя
3. Откуда вы знаете, какие элементы сравнивать? по имени?
4. @StavSheiz да, по именам объектов, которые я указал выше, это только те объекты, с которыми я хочу сравнить их значения
5. Думаю, теперь я понимаю. Вы хотите сравнивать объекты, а не массивы, и сравнивать только некоторые их свойства?
Ответ №1:
Вы можете создать функцию, которая будет выполнять проверку.
Примечания :
- Мы используем
==
для сравнения, потому что в вашем примереweight: 50
должно быть равноweight: '50'
(строка и число). - Функция также сравнивает внутренний массив
reference
, используя те же ключи для сравнения.
function compareObjects(obj1, obj2, keysToCompare) {
return keysToCompare.every(x => obj1[x] instanceof Array ?
obj1[x].every((y, yi) => compareObjects(y, obj2[x][yi], Object.keys(y))) :
obj1[x] == obj2[x]);
}
// Nothing is different - should work
console.log(compareObjects({
name: 'John',
surname: 'doe',
reference: [{
name: 'jane',
surname: 'smith',
},
{
name: 'kate',
surname: 'post'
},
],
id: '12364',
weight: '50',
Oid: '456978',
code: '12',
}, {
name: 'John',
surname: 'doe',
reference: [{
name: 'jane',
surname: 'smith',
}, {
name: 'kate',
surname: 'post',
}],
id: '4589632',
weight: 50,
policy: '745896',
result: 'test',
documents: 'no',
launch: 'no',
}, [
'name',
'surname',
'reference',
'weight',
]));
// One key is different - should fail
console.log(compareObjects({
name: 'John',
surname: 'doe',
reference: [{
name: 'jane',
surname: 'smith',
}, {
name: 'kate',
surname: 'post',
}],
id: '12364',
weight: '50',
Oid: '456978',
code: '12',
}, {
name: 'John',
// This value is different
surname: 'FOOL',
reference: [{
name: 'jane',
surname: 'smith',
}, {
name: 'kate',
surname: 'post',
}],
id: '4589632',
weight: 50,
policy: '745896',
result: 'test',
documents: 'no',
launch: 'no',
}, [
'name',
'surname',
'reference',
'weight',
]));
// One key is different - should fail
console.log(compareObjects({
name: 'John',
surname: 'doe',
reference: [{
name: 'jane',
surname: 'smith',
}, {
name: 'kate',
surname: 'post',
}],
id: '12364',
weight: '50',
Oid: '456978',
code: '12',
}, {
name: 'John',
surname: 'doe',
reference: [{
name: 'jane',
// This value is different
surname: 'FOOL',
}, {
name: 'kate',
surname: 'post',
}],
id: '4589632',
weight: 50,
policy: '745896',
result: 'test',
documents: 'no',
launch: 'no',
}, [
'name',
'surname',
'reference',
'weight',
]));
// Position is different - should work
console.log(compareObjects({
name: 'John',
surname: 'doe',
reference: [{
name: 'jane',
surname: 'smith',
position: 10,
},
{
name: 'kate',
surname: 'post',
position: 10,
},
],
id: '12364',
weight: '50',
Oid: '456978',
code: '12',
}, {
name: 'John',
surname: 'doe',
reference: [{
name: 'jane',
surname: 'smith',
position: 10,
}, {
name: 'kate',
surname: 'post',
position: 15,
}],
id: '4589632',
weight: 50,
policy: '745896',
result: 'test',
documents: 'no',
launch: 'no',
}, [
'name',
'surname',
'reference',
'weight',
]));
// Everything is same - should work (including position)
console.log(compareObjects({
name: 'John',
surname: 'doe',
reference: [{
name: 'jane',
surname: 'smith',
position: 10,
},
{
name: 'kate',
surname: 'post',
position: 10,
},
],
id: '12364',
weight: '50',
Oid: '456978',
code: '12',
}, {
name: 'John',
surname: 'doe',
reference: [{
name: 'jane',
surname: 'smith',
position: 10,
}, {
name: 'kate',
surname: 'post',
position: 10,
}],
id: '4589632',
weight: 50,
policy: '745896',
result: 'test',
documents: 'no',
launch: 'no',
}, [
'name',
'surname',
'reference',
'weight',
]));
Комментарии:
1. это отлично работает, но я только сейчас понял, что в моем вложенном массиве «ссылка» у меня есть другой массив, встроенный в него как {name:»test»,фамилия: «test»,array:[name:»array1″,позиция: «2»]}, как бы я включил вложенныймассив из вложенного массива в функцию?
2. Итак, вы
position
также хотите сравнить?3. да, все, что находится внутри встроенного «массива»
Ответ №2:
Для данного сценария / примера надежным и даже рекомендуемым подходом было предоставить пользовательскую функцию stringify, которая унифицирует / нормализует любую предоставленную структуру объекта (они могут отличаться среди объектов), а также очищает любой тип значения объекта (который, например, отличается среди примеров объектов, предоставленных OP), изатем возвращает строку, представляющую этот самый объект.
Объекты, которые были обработаны таким образом, затем можно безопасно сравнивать друг с другом…
const objA = {
name: "John",
surname: "doe",
reference: [{
name: "jane", surname: "smith", array: [
{ position: 12, surname: "test", name: "test" }
]
}, {
name: "kate", surname:"post", array:[
{ name: "test", surname: "test", position: 12 }
]
}],
id: "12364",
weight: "50",
Oid: "456978",
code: "12",
};
const objB = {
reference: [{
surname:"post", name: "kate", array:[
{ name: "test", surname: "test", position: 12 }
]
}, {
array: [
{ name: "test", surname: "test", position: 12 }
],
name: "jane",
surname: "smith",
}],
surname: "doe",
name: "John",
id: "4589632",
weight: 50,
policy: "745896",
result: "test",
documents: "no",
launch: "no",
};
const objC = {
name: "John", surname: "doe",
reference: [{
name: "jane", surname: "smith", array: [
{ position: 12, surname: "test", name: "test" }
]}, {
name: "kate", surname:"post", array:[
{ name: "test", surname: "test", position: 12 }
]
}],
weight: "60",
};
const objD = {
name: "John", surname: "doe",
reference: [{
name: "jane", surname: "smith", array: [
{ position: 12, surname: "test", name: "test" }
]}, {
name: "kate", surname:"post", array:[
{ name: "test", surname:"test", position: 24 }
]
}],
weight: "60",
};
const orderByName = (a, b) =>
a.surname.localeCompare(b.surname) || a.name.localeCompare(b.name);
function normalizeItemReference(arr) {
return arr
// assure a certain order.
.sort(orderByName)
// assure identical structure.
.map(({ name, surname, array }) =>
({
name,
surname,
array: array
// assure a certain order.
.sort(orderByName)
// assure identical structure and value type.
.map(({ name, surname, position }) =>
({ name, surname, position: Number(position) })
)
})
);
}
function stringifyItem(obj) {
const { name, surname, weight, reference } = obj;
return JSON.stringify({
// assure identical structure and value types.
name,
surname,
weight: Number(weight),
reference: normalizeItemReference(reference)
});
}
console.log(
'(stringifyItem(objA) === stringifyItem(objB)) ?',
(stringifyItem(objA) === stringifyItem(objB))
);
console.log(
'(stringifyItem(objA) === stringifyItem(objC)) ?',
(stringifyItem(objA) === stringifyItem(objC))
);
console.log(
'(stringifyItem(objC) === stringifyItem(objD)) ?',
(stringifyItem(objC) === stringifyItem(objD))
);
console.log(
'stringifyItem(objA) ...',
stringifyItem(objA)
);
console.log(
'stringifyItem(objB) ...',
stringifyItem(objB)
);
console.log(
'stringifyItem(objC) ...',
stringifyItem(objC)
);
console.log(
'stringifyItem(objD) ...',
stringifyItem(objD)
);
.as-console-wrapper { min-height: 100%!important; top: 0; }