2017-03-17 6 views
1

Ich möchte URL queries mit Objekt keys und values übereinstimmen.überprüfen, ob Array von Strings mit OBJ-Schlüssel/Eigenschaften übereinstimmt

URL: ?cost=10&name=item

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

Wie kann ich überprüfen, ob keys[] Matches Object.keys(query) und values[] Matches Object.values(query)? Ich habe versucht mit for..in und verschiedenen Kombinationen von .map(); .filter(); .indexOf() > -1 sowohl keys[] und values[].

Auch 10 == '10' sollte true zurückgeben.

+0

haben Sie bereits die rohe Abfrage aufgeteilt in die 'query' Objekt? –

+0

@le_m yep, Objekt hat 10 Eigenschaften und URL kann bis zu 10 Abfragen haben, hängt davon ab, wie viele Filter angewendet werden – nehel

+0

Im obigen Beispiel sollte das Testergebnis 'true' oder' false' lauten? Ist "Kosten" abgestimmt oder nicht ('10 == '10''?)? –

Antwort

1

Damit die bestimmte Abfrage gegebenen Schlüssel und Werte identisch zu sein, (1) die Länge der beiden gleich sein, und (2) jeder Abfrageparameter müssen in den gegebenen Schlüssel und Werte enthalten sein:

// 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

Schleife über das Objekt, mit indexOf(), um zu sehen, ob der Name der Eigenschaft in keys ist und der Wert in dem entsprechenden Element von values ist.

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]); 
    } 
} 

Oder Sie könnten Schleife über keys:

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

Dies überprüft nicht, wenn die Abfrage weniger Parameter als durch Schlüssel & Werte gegeben hat. –

+0

Der zweite prüft das. – Barmar

+0

Sie haben Recht! Möchte das '' 'durch' 'obwohl ersetzen :) –

1

können Sie zunächst prüfen, wenn die Länge der Objekteigenschaften die gleichen wie Tasten-Array und verwenden Sie dann every() und includes() für beide Schlüssel und Werte zu überprüfen.

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

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

+0

@ibrahim mahrir Danke, –

+0

Liefert true für zB 'query = {kosten: 10, name: 'item'}, keys = ['kosten', 'name'], values ​​= ['item' '10 '] ' –

1

Verwenden some wie folgt aus:

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));

oder eine for Schleife wie folgt verwenden:

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

Erste gibt True für zB 'query = {kosten: 10, name: 'item', mehr: 'ja'}, keys = ['kosten', 'name'], values ​​= ['10', 'item'] ' –

+0

@le_m Beide tun es ! Was ist das Problem? –

+0

Die Abfrage hat mehr Parameter als die Schlüssel & Werte, mit denen es verglichen wird.Meinem Verständnis zufolge, dies Shou Ich würde nicht zusammenpassen. OP könnte jedoch klären wollen. –

2

Überprüfen Sie die Array.prototype.every() Methode auf dem Mozilla Developer Network aus. Die Funktion unten erfüllt die folgenden Kriterien entsprechenden:

  1. Die Anzahl der Tasten in query ist das gleiche wie die Anzahl der Schlüssel in dem keys Array.
  2. Die Anzahl der Werte in query ist identisch mit der Anzahl der Werte im Array values.
  3. Jeder Schlüssel im Array keys ist auch in query.
  4. Der Wert bei query[key] entspricht dem Wert im Array values bei dem entsprechenden Index.

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)); 

Ich hoffe, dass dies Ihre Frage beantwortet. Glückliche Kodierung!

+0

'['10']. Enthält (10) == false' entgegen dem letzten Kommentar von OP, siehe oben. –

+0

Gibt auch für z. 'query = {Kosten: '10 ', Name: '10'}, Schlüssel = ['Kosten', 'Name'], Werte = ['10', '20']' –

+0

Danke @le_m. Die aktualisierte Antwort behebt die Probleme, die Sie aufgetreten sind. –

Verwandte Themen