javascript - 如何找出对象中的键是否具有值数组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;
在这里,我总是指向对象的第二个索引键位置。但是这里不是这样,具有数组值的键被随机放置在对象中。
解决方案
您当前的方法有一些问题,主要问题是它不处理动态数据,而是试图让您的代码为您提供的一个对象工作。
您可能会发现从头开始创建新对象比尝试使用克隆现有对象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()
,以转换每个内部键值对。要进行转换,您可以首先检查键是否需要复数,方法是检查是否:
- 该值是一个数组,使用
Array.isArray()
- 密钥还没有以
"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);
推荐阅读
- python - 使用 python 和 Tesseract OCR 从文本中提取特定内容
- angular - 415 不支持的媒体类型;Angular 到 ASP.Net Core API
- php - 如何在不使用 ajax 重新加载的情况下提交我的表单?
- kubernetes - “kubectl describe ingress ...”找不到请求的资源
- node.js - 节点服务器无法处理使用 axios get 发送的数据并返回与邮递员不同的错误
- asp.net - asp net core 2.2 重定向 url 包括 %252F 和 apache 2.4
- javascript - 如何更改“HTML”样式
- sql-server - 在 TSQL 中关闭和释放游标和 Try-Catch
- google-apps-script - 如何有条件地清除基于复选框的范围中包含的行中的内容?
- compiler-construction - 使用 antlr4 时无法识别 Lexer 令牌