假設我有兩個物件陣列,
let detail1 = [
{'book':'LOTR','price':'14'}
{'book':'Harry pottar','price':'12'},
]
let detail2 = [
{'book':'Harry pottar','price':'15'},
{'book':'LOTR','Price':'14'},
{'book':'HPP','Price':'21'}
]
我想比較兩個物件陣列并根據它們是否相同回傳 true 或 false。
注意:物件的結構即鍵將始終相同,它們的值可能會或可能不會改變。
為此,我嘗試過,
for(let i = 0 ;i<detail1.length; i ){
for(let j = 0; j<detail2.length; j ){
if(JSON.stringify(detail1[i]) === JSON.stringify(detail2[i])){
boolValue = true
} else {
boolValue = false
}
}
}
但這給出了不正確的值,假設我有另一個物件陣列,
let detail1 = [
{'book':'LOTR','price':'14'}
{'book':'Harry pottar','price':'12'},
]
let detail2 = [
{'book':'Harry pottar','price':'12'},
{'book':'LOTR','price':'14'}
]
但是當訂單改變時,它給出了不正確的值。
在給定物件結構(即鍵相同)的情況下,比較兩個物件陣列并在它們相同時回傳真,如果不同則回傳假的可能解決方案是什么。
uj5u.com熱心網友回復:
您不能使用 JSON 編碼來檢查相等性,因為它依賴于順序,例如:
console.log(
JSON.stringify({'book':'LOTR','price':'14'}) == JSON.stringify({'price':'14', 'book':'LOTR'})
)
但是,您可以執行以下操作:
let detail1 = [
{'book':'LOTR','price':'14'},
{'book':'Harry pottar','price':'12'},
]
let detail2 = [
{'book':'Harry pottar','price':'15'},
{'book':'LOTR','Price':'14'},
{'book':'HPP','Price':'21'}
]
function equal(a, b){
return a.length == b.length && // same length and
a.every( // every element in a
e1 => b.some( // has a match in b
e2 => e1.book == e2.book && e1.price == e2.price
)
)
}
console.log(equal(detail1,detail2), equal(detail1,detail1), equal(detail2,detail2))
正如@TJ Crowder指出的那樣,您實際上可以避免手動檢查物件的每個條目并使用Object.entries(請注意僅當您的物件僅由鍵對字串組成時才使用它)
let detail1 = [
{'book':'LOTR','price':'14'},
{'book':'Harry pottar','price':'12'},
]
let detail2 = [
{'book':'Harry pottar','price':'15'},
{'book':'LOTR','Price':'14'},
{'book':'HPP','Price':'21'}
]
function equal(a, b){
return a.length == b.length && // same length and
a.every( // every element in a
e1 => b.some( // has a match in b
e2 => Object.keys(e1).every(key => e1[key] === e2[key])
)
)
}
console.log(equal(detail1,detail2), equal(detail1,detail1), equal(detail2,detail2))
uj5u.com熱心網友回復:
您可以使用Object.keys和每個
arr1.length !== arr2.length &&
arr1.every((o, i) =>
Object.keys(o).every((prop) => arr2[i][prop] && arr2[i][prop] === o[prop])
)
let detail1 = [
{ book: "LOTR", price: "14" },
{ book: "Harry pottar", price: "12" },
];
let detail2 = [
{ book: "Harry pottar", price: "15" },
{ book: "LOTR", Price: "14" },
{ book: "HPP", Price: "21" },
];
function isEqual(arr1, arr2) {
if (arr1.length !== arr2.length) return false;
return arr1.every((o, i) => {
return Object.keys(o).every((prop) => {
return arr2[i][prop] && arr2[i][prop] === o[prop];
});
});
}
console.log(isEqual(detail1, detail2));
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/331433.html
標籤:javascript 数组 目的
上一篇:將陣列復制到陣列索引C
