Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何确定对象中的键是否具有值数组_Javascript_Arrays_Json_Object - Fatal编程技术网

Javascript 如何确定对象中的键是否具有值数组

Javascript 如何确定对象中的键是否具有值数组,javascript,arrays,json,object,Javascript,Arrays,Json,Object,我试图解决这个问题: 在此函数中,将为您提供一个对象。该对象正在存储有关键的信息。例如 { name: 'Tom', job: ['writing katas', 'marking'], favouriteShop: [ "Paul's Donkey University", "Shaq's Taxidermy Shack", "Sam's Pet Shop" ] }; 然而,在某些情况下,密钥

我试图解决这个问题:

在此函数中,将为您提供一个对象。该对象正在存储有关键的信息。例如

{
  name: 'Tom',
  job: ['writing katas', 'marking'],
  favouriteShop: [
    "Paul's Donkey University",
    "Shaq's Taxidermy Shack",
    "Sam's Pet Shop"
  ]
};
然而,在某些情况下,密钥的名称非常糟糕。良好的命名约定告诉我们,包含数组的键应命名为复数

此函数应返回一个新对象,该对象是输入的副本,但任何键都包含多元化数组(末尾添加了一个“s”)

我的尝试:

let cloneObj = Object.assign({},obj);
  let arrayOfKeys = Object.keys(obj);
  if(arrayOfKeys.length === 3){
    let plural = arrayOfKeys[1]+"s"
    cloneObj[plural] = cloneObj[arrayOfKeys[1]];
    delete cloneObj[arrayOfKeys[1]];
  }
  return cloneObj;


这里我总是指向对象的第二个索引键位置。但这里的情况并非如此,带有数组值的键被随机放置在对象中。

您当前的方法存在一些问题,主要的问题是它不处理动态数据,而是尝试让代码为给定的一个对象工作。
您可能会发现从头开始创建新对象比使用
object.assign()
克隆现有对象,然后使用
delete
修改现有对象更容易。取而代之,您可以通过抓取对象的名称从头开始构建一个新对象,这将为您提供一个
[[key,value],…]
对数组,其形式如下:

[
  ["name", "Tom"],
  ["job", ["writing katas", "marking"]],
  ["favouriteShop", ["Paul's Donkey University", "Shaq's Taxidermy Shack", "Sam's Pet Shop"]]
]
然后可以使用映射该键值对数组,以转换每个内部键值对。要转换,您可以首先检查密钥是否需要复数,方法是检查:

  • 该值是使用
  • 该键尚未以
    “s”
  • 如果这两个条件都通过,您可以在键值末尾添加一个
    “s”
    (这是使用下面的
    复数化功能完成的。一旦您修改了内部
    [键值]
    pair Array,您可以通过将映射函数包装为类似这样的调用,将其转换回对象:

    const inp={name:'Tom',job:['writing katas','marking'],最喜欢的商店:[“保罗的驴子大学”,“沙克的标本室”,“山姆的宠物店];
    const pluralize=str=>str+(str.endsWith('s')?“'s');
    const res=Object.fromEntries(Object.entries(inp.map(
    ([key,val])=>[Array.isArray(val)?复数(key):key,val])
    );
    
    console.log(res);
    我可以建议这个选项,如果对象的键还没有
    s
    结尾,它会将
    s
    添加到对象的键中

    constoldobj={name:'Tom',job:['writing katas','marking'],最喜欢的商店:[“保罗的驴子大学”,“沙克的标本室”,“山姆的宠物店”]}
    常量betterKeyName=(对象)=>{
    常量obj={};
    Object.entries(Object.forEach)([key,value])=>{
    if(数组&&!字符串(key).endsWith('s')的值实例){
    obj[`${key}s`]=值
    }否则{
    obj[键]=值
    }
    });
    返回obj;
    }
    const newObj=更好的关键字名称(oldObj);
    
    console.log(newObj)
    您能分享您在具体操作中遇到的问题吗/请分享您的尝试吗?我必须解决一个给定对象的问题…..对象中的一个键具有数组作为值,因此我必须通过在键名称的最后添加“s”来多元化该键的名称。@IbrahimAhmed您能分享您的尝试吗?
    让cloneObj=object.assign({},obj);let arrayOfKeys=Object.keys(obj);if(arrayOfKeys.length==3){let mulral=arrayOfKeys[1]+“s”cloneObj[mulral]=cloneObj[arrayOfKeys[1]];delete cloneObj[arrayOfKeys[1]];}return cloneObj;
    我已经试过了,但这是一个硬代码,我假设带有数组值的键总是放在索引1中。但这不是带有数组值的键随机放在对象中的情况。
    [
      ["name", "Tom"],
      ["job", ["writing katas", "marking"]],
      ["favouriteShop", ["Paul's Donkey University", "Shaq's Taxidermy Shack", "Sam's Pet Shop"]]
    ]