簡體   English   中英

檢查匹配的鍵是否相等

[英]Check if matching keys are equal

我搜索了這里是否存在這個問題,但找不到。

假設我們有兩個對象,我們想檢查匹配的鍵是否相等,例如:

const style1 = {
    color: 'brown',
    backgroundColor: 'blue',
    border: '3px solid blue'
}

const style2 = {
    fontSize: '16px',
    padding: '10px',
    color: 'brown'
}

類似的結果:

isMatchingKeysEqual(style1, style2)

應該返回true

迭代一個對象的鍵/值對( “entries” ),並通過Array.prototype.some()檢查是否匹配另一個。

 function isMatchingKeysEqual(obj1, obj2) { return Object.entries(obj1).some(([ key, val ]) => obj2[key] === val) } const style1 = { color: 'brown', backgroundColor: 'blue', border: '3px solid blue' } const style2 = { fontSize: '16px', padding: '10px', color: 'brown' } console.log(isMatchingKeysEqual(style1, style2))

請注意,這僅適用於深度為 1 的對象。如果您需要檢查具有對象或數組值的復雜對象,則需要執行一些遞歸操作。

這個問題我想了好幾天了,相信我已經有了一個滿意的解決方案。

我想編寫一個可以接收 n 個對象參數的函數。 這樣它就可以用於不止兩個對象。

這里是:

function areIntersectingKeysEqual(...objects) {
  return objects
    .map((object) => Object.keys(object))
    .sort((a, b) => a.length - b.length)
    .reduce((a, b) => a.filter((key) => b.includes(key)))
    .every((key) => objects.every((object) => object[key] === objects[0][key]));
}

讓我解釋一下它是如何工作的。

在高層次上,首先我們找到相交的鍵,然后我們確定是否所有相交的鍵都相等。

  1. 映射所有對象,返回一個鍵數組數組。
  2. 按長度升序對列表進行排序(這是一個優化,首先過濾最短的鍵列表)
  3. 減少我們的鍵列表,根據下一個數組包含該鍵的條件過濾它們。 這就是我們如何找到相交鍵。
  4. 現在我們有了一個交叉鍵的列表,我們可以確定這些鍵是否相等。 對於每個鍵,檢查每個對象中的值是否相等。
  5. 最后,返回結果布爾值。

這是它的使用方法。

 function areIntersectingKeysEqual(...objects) { return objects .map((object) => Object.keys(object)) .sort((a, b) => a.length - b.length) .reduce((a, b) => a.filter((key) => b.includes(key))) .every((key) => objects.every((object) => object[key] === objects[0][key])); } const style1 = { color: 'brown', backgroundColor: 'blue', border: '3px solid blue', }; const style2 = { fontSize: '16px', padding: '10px', color: 'brown', }; const style3 = { fontSize: '10px', color: 'blue', }; areIntersectingKeysEqual(style1, style2); // true areIntersectingKeysEqual(style1, style2, style3); // false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM