检查字符串数组是否与 OBJ 键/属性匹配



我想将 URL queries与对象keysvalues匹配。

网址: ?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

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

我希望这能回答你的问题。祝您编码愉快!

为了使给定的查询与给定的键和值相同,(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));

这样使用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));

您可以先检查对象属性的长度是否与键数组相同,然后使用 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)

遍历对象,使用 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]);
    }
});

最新更新