【问题标题】:How to find out if a key in object has array of values javascript如何找出对象中的键是否具有值数组javascript
【发布时间】:2021-04-21 12:39:45
【问题描述】:

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

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

{
  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;

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

【问题讨论】:

  • 您能具体分享一下您遇到的问题/您的尝试吗?
  • 我必须解决给定对象的问题.....对象中的一个键具有数组作为值,因此我必须通过添加's'来复数该键的名称最后是键名。
  • @IbrahimAhmed 你能分享你的尝试吗?
  • 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;
  • 我已经尝试过了,但这是一个硬代码我假设具有数组值的键始终放置在索引 1 处。但情​​况并非如此,具有数组值的键是随机放置的在对象中。

标签: javascript arrays json object


【解决方案1】:

您当前的方法存在一些问题,主要问题是它不处理动态数据,而是试图让您的代码为您提供的一个对象工作。
您可能会发现从头开始创建新对象比尝试使用Object.assign() 克隆现有对象然后使用delete 修改它更容易。相反,您可以通过抓取对象的 entries 来从头开始构建一个新对象,这将为您提供以下形式的 [[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 新手,这可能比上面的更容易理解(详见代码 cmets):

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

【讨论】:

    【解决方案2】:

    我可以建议这个选项,如果它还没有 s 结尾,它会将 s 添加到对象的键中

    const oldObj = { name: 'Tom', job: ['writing katas', 'marking'], favouriteShop: [ "Paul's Donkey University", "Shaq's Taxidermy Shack", "Sam's Pet Shop" ] }
    
    
     const betterKeyName = (object) => {
            const obj = {};
            
            Object.entries(object).forEach(([key, value]) => {
                if (value instanceof Array && !String(key).endsWith('s')) {
                    obj[`${key}s`] = value
                } else {
                    obj[key] = value
                }
            });
    
            return obj;
        }
    
    const newObj = betterKeyName(oldObj);
    console.log(newObj);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 2015-09-16
      • 2022-01-11
      • 2019-03-31
      • 2012-06-05
      • 2021-12-30
      • 2022-11-21
      相关资源
      最近更新 更多