首页 > 解决方案 > 如何找出对象中的键是否具有值数组javascript

问题描述

我正在尝试解决这个问题:

在此功能中,您将获得一个对象。该对象正在存储有关键的信息。例如

{
  name: 'Tom',
  job: ['writing katas', 'marking'],
  favouriteShop: [
    "Paul's Donkey University",
    "Shaq's Taxidermy Shack",
    "Sam's Pet Shop"
  ]
};

然而,在某些情况下,密钥的命名非常糟糕。良好的命名约定告诉我们包含数组的键应该以复数形式命名。

此函数应返回一个新对象,该对象是输入的副本,但包含包含复数数组的任何键(末尾添加了一个 's'。)例如

{
  name: 'Tom',
  jobs: ['writing katas', 'marking'],
  favouriteShops: [
    "Paul's Donkey University",
    "Shaq's Taxidermy Shack",
    "Sam's Pet Shop"
  ]
}

我的尝试:

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;

在这里,我总是指向对象的第二个索引键位置。但是这里不是这样,具有数组值的键被随机放置在对象中。

标签: javascriptarraysjsonobject

解决方案


您当前的方法有一些问题,主要问题是它不处理动态数据,而是试图让您的代码为您提供的一个对象工作。
您可能会发现从头开始创建新对象比尝试使用克隆现有对象Object.assign()然后使用delete. 相反,您可以通过抓取对象的条目从头开始构建一个新对象,这将为您提供一[[key, value], ...]对形式的数组:

[
  ["name", "Tom"],
  ["job", ["writing katas", "marking"]],
  ["favouriteShop", ["Paul's Donkey University", "Shaq's Taxidermy Shack", "Sam's Pet Shop"]]
]

然后可以用 , 映射这个键值对数组.map(),以转换每个内部键值对。要进行转换,您可以首先检查键是否需要复数,方法是检查是否:

  1. 该值是一个数组,使用Array.isArray()
  2. 密钥还没有以"s"

如果这两个条件都通过,您可以"s"在键值的末尾添加一个(这是使用pluralize下面的函数完成的。一旦您修改了内部[key, value]对数组的键,您可以通过包装将其转换回对象你的映射函数变成这样的调用Object.fromEntries()

const inp = { name: 'Tom', job: ['writing katas', 'marking'], favouriteShop: [ "Paul's Donkey University", "Shaq's Taxidermy Shack", "Sam's Pet Shop" ] };

const pluralize = str => str + (str.endsWith('s') ? '': 's');
const res = Object.fromEntries(Object.entries(inp).map(
  ([key, val]) => [Array.isArray(val) ? pluralize(key) : key, val])
);
console.log(res);

上面的逻辑可以重写为使用更命令式的方法,通过使用for...in循环来循环键和值,并使用传统的 if 语句来检查条件。如果你是 JavaScript 新手,这可能比上面的更容易理解(详见代码注释):

const inp = { name: 'Tom', job: ['writing katas', 'marking'], favouriteShop: [ "Paul's Donkey University", "Shaq's Taxidermy Shack", "Sam's Pet Shop" ] };

function pluralize(str) {
  if(str.endsWith('s')) {
    return str;
  } else {
    return str + 's';
  }
} 

const res = {};
for(const key in inp) {
  const value = inp[key]; // get value stored at the current key
  if(Array.isArray(value)) { // if the value is an array:
    const keyPluralized = pluralize(key); //  pluralize the key
    res[keyPluralized] = value; // and add the key to the `res` object
  } else { // value is not an array:. the result
    res[key] = value; // so just add the key and value to
  }
}
console.log(res);


推荐阅读