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

时间:2017-03-17 23:30:02

标签: javascript

我想将网址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)?我在for..in.map(); .filter(); .indexOf() > -1上使用keys[]以及values[]的不同组合进行了尝试。

同样10 == '10'应该返回true

5 个答案:

答案 0 :(得分:2)

查看Mozilla开发者网络上的Array.prototype.every()方法。以下功能符合以下匹配条件:

  1. query中的键数与keys数组中的键数相同。
  2. query中的值数与values数组中的值数相同。
  3. keys数组中的每个键也位于query
  4. query[key]处的值等于适当索引处values数组中的值。
  5. 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));