2017-03-17 250 views
1

我想匹配URL queries與對象keysvalues檢查字符串數組是否與obj鍵/屬性匹配

網址:?cost=10&name=item

const query = { cost: 10, name: 'item' } 
const keys = ['cost', 'name'] 
const values = ['10', 'item'] 

我如何檢查是否keys[]比賽Object.keys(query)values[]比賽Object.values(query)?我在keys[]values[]上嘗試了for..in.map(); .filter(); .indexOf() > -1的不同組合。

另外10 == '10'應該返回true

+0

你已經有原始查詢拆分成'query'對象? –

+0

@le_m是的,object有10個屬性,url最多可以有10個查詢,取決於應用了多少個過濾器 – nehel

+0

在上面的例子中,測試結果應該是true還是false? 「成本」是否匹配('10 =='10''?)? –

回答

1

爲了使給定的查詢是相同的給定的鍵和值,(1)兩者的長度必須是相同的,(2)每個查詢參數必須被包含在給定的鍵和值:

// Compare query keys and values: 
 
function identical(query, keys, values) { 
 
    return Object.keys(query).length == new Set(keys).size && 
 
     keys.every((key, i) => query[key] == values[i]); 
 
} 
 

 
// Example: 
 
const query = {cost: 10, name: 'item'}; 
 
const keys = ['cost', 'name']; 
 
const values = ['10', 'item']; 
 

 
console.log(identical(query, keys, values));

1

在對象上循環使用indexOf()查看屬性名稱是否在keys中,並且該值位於values的相應元素中。

for (var k in query) { 
    var kindex = keys.indexOf(k); 
    if (kindex == -1 || values[kindex] != query[k]) { 
     console.log('Invalid key = ' + k + ' value = ' + query[k]); 
    } 
} 

,或者你可以遍歷keys

keys.forEach(function(key, i) { 
    if (!(key in query && query[key] == values[i])) { 
     console.log('Missing key = ' + key + ' value = ' + values[i]); 
    } 
}); 
+0

雖然查詢的參數少於鍵和值的值,但這並不檢查。 –

+0

第二個檢查。 – Barmar

+0

你是對的!可能要用''替換'''儘管:) –

1

您可以首先檢查對象屬性的長度是一樣的按鍵排列,然後用every()includes()檢查鍵和值。

const query = { cost: 10, name: 'item' } 
 
const keys = ['cost', 'name'] 
 
const values = ['10', 'item'] 
 

 
var check = Object.keys(query).length == keys.length 
 
    && Object.keys(query).every(function(key) { 
 
     return keys.includes(key) && values.includes(String(query[key])) 
 
    }) 
 
      
 
console.log(check)

+0

平視:http://stackoverflow.com/questions/42868616/check-if-array-of-strings-matches-obj-keys-properties/ 42868691#comment72843573_42868616 –

+0

@ibrahim mahrir明白了,謝謝。 –

+0

對於例如'query = {cost:10,name:'item'},keys = ['cost','name'],values = ['item' ,'10']' –

1

使用some這樣的:

function match(query, keys, values) { 
 
    return ! keys.some(function(key, i) { // inverse the test 
 
    return query[key] != values[i]; 
 
    }); 
 
} 
 

 
const query = { cost: 10, name: 'item' }; 
 
const keys = ['cost', 'name']; 
 
const values = ['10', 'item']; 
 

 
console.log(match(query, keys, values));

或者使用for循環是這樣的:

function match(query, keys, values) { 
 
    for(var i = 0; i < keys.length; i++) 
 
    if(query[keys[i]] != values[i]) return false; // if some key doesn't match return false 
 
    
 
    return true; // all keys matched return true 
 
} 
 

 
const query = { cost: 10, name: 'item' }; 
 
const keys = ['cost', 'name']; 
 
const values = ['10', 'item']; 
 

 
console.log(match(query, keys, values));

+0

第一個例如'query = {cost:10,name:'item',more:'yes'},keys = ['cost','name'],values = ['10','item']' –

+0

@le_m兩者都是!問題是什麼? –

+0

查詢的參數比與它比較的鍵和值要多。根據我的理解,這條命ld不匹配。 OP可能想澄清。 –

2

退房Mozilla開發者網絡上Array.prototype.every()方法。下面的函數滿足以下匹配標準:

  1. 密鑰的query數是一樣的keys陣列中的密鑰的數量。
  2. query中的值數與values數組中的值數相同。
  3. keys陣列中的每個密鑰也位於query中。
  4. query[key]上的值等於values數組中相應索引處的值。

function matches(query, keys, values) { 
    const queryKeys = Object.keys(query); 
    const queryValues = Object.values(query); 
    return (
    queryKeys.length === keys.length && 
    queryValues.length === values.length && 
    keys.every((key, index) => queryKeys.includes(key) && query[key] == values[index]) 
); 
} 

const query = { 
    cost: 10, 
    name: 'item' 
}; 
const keys = ['cost', 'name']; 
const values = ['10', 'item']; 

console.log(matches(query, keys, values)); 

我希望這回答了你的問題。快樂的編碼!

+0

'['10']。包括(10)== false'違背OP的最新評論,參見上文。 –

+0

另外,對於例如'query = {cost:'10',name:'10'},keys = ['cost','name'],values = ['10','20']' –

+0

謝謝@le_m。更新的答案可以解決您提到的問題。 –

相關問題