我想将网址queries
与对象keys
和values
匹配。
网址:?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)
?我在for..in
和.map(); .filter(); .indexOf() > -1
上使用keys[]
以及values[]
的不同组合进行了尝试。
同样10 == '10'
应该返回true
。
答案 0 :(得分:2)
查看Mozilla开发者网络上的Array.prototype.every()方法。以下功能符合以下匹配条件:
query
中的键数与keys
数组中的键数相同。query
中的值数与values
数组中的值数相同。keys
数组中的每个键也位于query
。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));
我希望这能回答你的问题。快乐的编码!
答案 1 :(得分: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]);
}
});
答案 2 :(得分:1)
您可以先检查对象属性的长度是否与keys数组相同,然后使用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)
答案 3 :(得分: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));
答案 4 :(得分: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));