我有兩個物件 x,y,我想比較這兩個物件,不包括一個鍵“c”
let x = {a: 5, b: 6, c: "string"}
let y = {a: 5, b: 8, c: "string"}
我試圖比較它的方式是 -
JSON.stringify(x) === JSON.stringify(y)
上面的作品,但它會比較我想在此處排除 c 的所有鍵。實作這一目標的最佳方法是什么?
uj5u.com熱心網友回復:
以下代碼從 object 中獲取所有鍵,從串列x中洗掉c,然后執行比較。
let x = { a: 5, b: 6, c: "string" };
let y = { a: 5, b: 6, c: "another string" };
console.log(
Object.keys(x)
.filter((key) => key !== "c")
.every((key) => x[key] === y[key])
);
uj5u.com熱心網友回復:
array.sort 需要一個comparator函式。你可以在這里使用完全相同的東西
function myObjComparator (x, y) {
if (x.a != y.a) return y.a - x.a;
return y.b - x.b;
}
uj5u.com熱心網友回復:
一般來說,我不會為了比較它們而對物件進行字串化。原因很簡單,就是必須確保成員的順序一致,否則結果不正確。
前任:
// objects are equals
const y = { a: '1', b: '2' }
const x = { b: '2', b: '1' }
// but result is not what you expect
JSON.stringify(x) === JSON.stringify(y) // false
但是,如果您可以確保成員的順序始終相同,則 stringify 是快速且不錯的選擇。
您可以使用擴展語法以避免“c”屬性
const remappedX = { ...x, c: undefined };
const remappedY = { ...y, c: undefined };
JSON.stringify(remappedX) === JSON.stringify(remappedY); // true
或者,
const allowedKeys = Object.keys(x).filter((k) => k !== 'c');
JSON.stringify(x, allowedKeys) === JSON.stringify(y, allowedKeys);
更通用的方法是回圈物件鍵或條目
for(const key of Object.keys(x)) {
if (key === 'c') {
continue;
}
if (x[key] !== y[key]) {
return false;
}
}
return true;
但是,如果您的物件是嵌套的,則需要使用深度相等演算法,這當然會更慢。
這里給出了更通用的答案
uj5u.com熱心網友回復:
那這個呢?
JSON.stringify(x, ['a','b']) === JSON.stringify(y, ['a','b']);
更好的解決方案:
function replacer(key, value) {
// Filtering out properties
if (key === 'c') {
return undefined;
}
return value;
}
JSON.stringify(x, replacer) === JSON.stringify(y, replacer);
更正更好的解決方案:
const filterKeys = (obj) => Object.keys(y).filter(k => k !== 'c').sort()
JSON.stringify(x, filterKeys(x)) === JSON.stringify(y, filterKeys(y));
uj5u.com熱心網友回復:
使用三元運算子比較兩個物件。
演示:
let x = {a: 5, b: 6, c: "string"};
let y = {a: 5, b: 8, c: "string"};
function compare(obj1, obj2) {
return (obj1.a != obj2.a) ? false : (obj1.b != obj2.b) ? false : true;
}
console.log(compare(x, y));
通過洗掉不需要的屬性,然后使用比較JSON.stringify()
演示:
let x = {a: 5, b: 6, c: "string"};
let y = {a: 5, b: 8, c: "string"};
delete x.c;
delete y.c;
console.log(JSON.stringify(x) === JSON.stringify(y));
uj5u.com熱心網友回復:
這是一個解決方案
const x = {a: 5, b: 8, c: "string1", d: {e: 9}}
const y = {a: 5, b: 8, c: "string2", d: {e: 9}}
const compare = (obj1, obj2, except = []) => {
if (Object.keys(obj1).length < Object.keys(obj2).length) {
[obj1, obj2] = [obj2, obj1];
}
for (const obj1Key in obj1) {
if (except.includes(obj1Key)) continue;
if (!obj2.hasOwnProperty(obj1Key)) return false;
if (typeof obj1[obj1Key] === 'object') {
if (typeof obj2[obj1Key] !== 'object') return false;
const isEqual = compare(obj1[obj1Key], obj2[obj1Key]);
if (isEqual) continue
return false;
}
if (obj1[obj1Key] !== obj2[obj1Key]) return false;
}
return true;
}
console.log(compare(x, y, ['c']));
uj5u.com熱心網友回復:
感謝大家對我的問題的快速回復,但下面是一個簡單的方法,我可以從中實作上述邏輯
import omit from "lodash/omit";
import isEqual from "lodash/isEqual";
let x = {a: 5, b: 6, c: "string"},
y = {a: 5, b: 8, c: "string"}
result = isEqual(omit(x, ['c']), omit(y, ['c']))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/437183.html
標籤:javascript 节点.js 反应
上一篇:互動收集器discord.js收集在收集器宣告之后執行的所有互動
下一篇:將具有重復默認資料的列插入查詢
