验证参数的所有Object.keys()是否等于特定键(JavaScript) 验证参数的所有Object.keys()是否等于特定键(JavaScript)

验证参数的所有Object.keys()是否等于特定键(JavaScript) 验证参数的所有Object.keys()是否等于特定键(JavaScript),javascript,arrays,Javascript,Arrays,我是新来的。我正在学习网络编程,现在我有点被Javascript卡住了。我想验证一下,当一个新对象被添加到一个数组中时,它是否具有所有必需的键。我在下面共享了一个数组对象、一个包含所有键的示例对象和一个不包含所有必需键的对象。我尝试使用Object.keys()将数组对象的键与要输入的对象进行比较。但是,不幸的是,包含所有关键点的对象和不包含所有关键点的对象都被视为不完整。我无法添加任何新对象,即使它们具有数组中其他对象所具有的所有键。有人知道我哪里出错了吗?我将非常感谢你的帮助 谢谢并向所有人

我是新来的。我正在学习网络编程,现在我有点被Javascript卡住了。我想验证一下,当一个新对象被添加到一个数组中时,它是否具有所有必需的键。我在下面共享了一个数组对象、一个包含所有键的示例对象和一个不包含所有必需键的对象。我尝试使用Object.keys()将数组对象的键与要输入的对象进行比较。但是,不幸的是,包含所有关键点的对象和不包含所有关键点的对象都被视为不完整。我无法添加任何新对象,即使它们具有数组中其他对象所具有的所有键。有人知道我哪里出错了吗?我将非常感谢你的帮助

谢谢并向所有人致以最良好的问候

弗朗西斯科

代码:

编辑: 非常感谢所有回答我的人!我从没想过你会看到我的留言。我非常感谢你。经过两个多小时的努力,我终于找到了解决方案,多亏了你的帮助,我才成功地解决了这个问题。谢谢大家!!代码如下所示(我只更改了比较对象键的方式):

感谢你们所有优秀的互联网人士!
Francisco

比较
对象.键(项)==对象.键(pokemonList[0])
不起作用,因为
===
执行。如果它们不是完全相同的数组(它们不是),这将永远不会成为真的

为此,您可以使用和:

Object.keys(pokemonList[0]).every(key=>key-in-item)
//用于测试
//objB拥有objA的所有钥匙:
const hasAllKeys=(objA,objB)=>(
key(objA).every(key=>objB中的key)
);
//有效对象
常量有效={
名称:“沃索尔”,
类型:[“水”,“无”],
身高:1,,
体重:22.5,
性别:[“男”、“女”],
类别:"海龟",,
进化:['blanoise'],
描述:“它被认为是长寿的象征。如果它的壳上有藻类,那它就非常古老了。”,
};
常数alsoValid={
名称:“Foo Wartortle”,
类型:['Foo','Water','None'],
身高:4,
体重:22225,,
性别:[“男”、“女”],
类别:"海龟",,
进化:['blanoise'],
描述:“它被认为是长寿的象征。如果它的壳上有藻类,那它就非常古老了。”,
};
//无效对象(缺少数据)
常量无效={
名称:“Bla”,
类型:['Bla','Bla'],
身高:1,,
体重:800,
};
console.log(hasAllKeys(有效、无效));//假的

console.log(hasAllKeys(有效,alsoValid));//true
您可以创建某种模式来确定新的口袋妖怪条目应该具有哪些键。这可以是反映完整对象的简单属性键数组

然后有一个函数,它在每个键上循环,并检查是否在给定对象中找到了每个键。根据结果,它返回true或false

const key=[
“姓名”,
“类型”,
“高度”,
“重量”,
“性别”,
“类别”,
“进化”,
“说明”
];
const shouldavekeys=(键,条目)=>
键。每个(键=>输入项中的键)和
keys.length==Object.keys(条目).length;
康斯特瓦托特尔={
名称:“沃索尔”,
类型:[“水”,“无”],
身高:1,,
体重:22.5,
性别:[“男”、“女”],
类别:"海龟",,
进化:['blanoise'],
说明:
“它被认为是长寿的象征。如果它的壳上有藻类,那它就非常古老了。”,
};
常数ekans={
名称:“Ekans”,
类型:[“无”],
身高:2,
};
console.log(应保存键(键,wartortle));

console.log(shouldavekey(key,ekans))我将使用类似的方法来验证对象,而不是手动尝试验证密钥。您可以要求某些值为true,也可以只要求所有键

const Yup = require('yup');

const YupSchema = Yup.object().shape({
  name: Yup.string().required('Name is required'),
  types: Yup.string().oneOf(['Water', 'None']),
  height: Yup.number().required('Height is required'),
  weight: Yup.number().required('Weight is required'),
  gender: Yup.string().oneOf(['Male', 'Female']),
  category: Yup.string().required('Category is required'),
  evolutions: Yup.string().oneOf(['Blastoise']),
  description: Yup.string().required('Description is required'),
});

try {
  const notPokemon = { name: 'John', types: 'Land' };
  YupSchema.validateSync(notPokemon);

  // This is a pokemon
} catch (err) {
  // This is not a pokemon
  console.error(err);
}

请参阅:这将验证
是否具有所需密钥的子集。Ah。正确的。将对象按相反的顺序排列。修正了。现在,即使它有额外的密钥,它也会验证。您可以比较每个对象的
键的长度作为附加检查。True。但是有额外的密钥是一个问题吗?嗯,你是对的,OP没有指定。这将验证该项是否有所需密钥的子集。您需要在另一个方向进行验证:
keys.every(key=>key-in-entry)
。感谢您的反馈。我相信在检查钥匙和长度时,应该确保它们具有正确的属性。是的。我们建议同样的解决方案。您的优点是明确说明所需内容,而不仅仅是匹配第一个对象。而且,您可以确保与长度比较完全匹配。OP不清楚这是否是一个要求,额外的钥匙是否是一个问题。
  function add(item) {
    if (typeof item === 'object') {

      // Changes here
      if (Object.keys(pokemonList[0]).every((key) => key in item)) {
      // Changes here
        alert(
          `You have discovered a new Pokémon! "${item.name}" data has been entered into the Pokédex.`
        );
        // Changes here (to validate)
        console.log(Object.keys(pokemonList[0]).every((key) => key in item));
        // Changes here (to validate)
        pokemonList.push(item);
      } else {
        alert(
          `The data for the new Pokémon you are trying to add is not complete. Please verify that no fields are missing.`
        );
        // Changes here (to validate)
        console.log(Object.keys(pokemonList[0]).every((key) => key in item));
        // Changes here (to validate)
      }
    } else {
      alert(
        `"${item}" is not a valid Pokémon! Please check that the data type typed in is an object.`
      );
    }
  }

const Yup = require('yup');

const YupSchema = Yup.object().shape({
  name: Yup.string().required('Name is required'),
  types: Yup.string().oneOf(['Water', 'None']),
  height: Yup.number().required('Height is required'),
  weight: Yup.number().required('Weight is required'),
  gender: Yup.string().oneOf(['Male', 'Female']),
  category: Yup.string().required('Category is required'),
  evolutions: Yup.string().oneOf(['Blastoise']),
  description: Yup.string().required('Description is required'),
});

try {
  const notPokemon = { name: 'John', types: 'Land' };
  YupSchema.validateSync(notPokemon);

  // This is a pokemon
} catch (err) {
  // This is not a pokemon
  console.error(err);
}