ionic4 - 如何遍历包含对象的数组并进行比较
问题描述
我正在使用 ionic 4。我从 API 获得结果,然后像这样获得结果显示
[
{"name":John,"age":20},
{"name":Peter,"age":35},
{"name":Alex,"age":15}
]
但我想得到这个名字只是为了检查是否与我的病情有相同的名字。但是我无法直接从 API 中获取结果,我需要硬编码来进行比较。这是我的代码:
this.http.get(SERVER_URL).subscribe((res) => {
const data = [
{ name: John, age: 21 },
{ name: Thomas, age: 25 },
];
const ppl= data.find(people=> people.name === 'alex');
console.log(ppl);
});
所以,我的第一个问题是如何直接从 API 获取名称,而不是像现在我从 API 硬编码结果。我的第二个问题是当我进行比较时,我想显示结果“已经存在”或“可以使用此名称”。因为如果我这样编写代码,我将收到错误Type 'void' is not assignable to type 'boolean':
const ppl= data.find((people)=> {
if(people.name === 'alex') {
this.text = 'already exist'
} else {
this.text = 'can use this name'
}});
console.log(ppl);
任何人都可以帮助我吗?非常感谢你
解决方案
不用定义数据,而是使用响应的内容;res
将具有您在 中声明的完全相同的内容data
。
this.http.get(SERVER_URL).subscribe(res => {
// If successful, res is an array with user data like the following
// [
// {name: "John", age: 21},
// {name: "Thomas", age: 25},
// ...
// ]
if (res.find(user => user.name === 'alex')) {
console.log ('Username has been taken');
} else {
console.log('Username is available');
}
});
取自Array.prototype.find() 上的 MDN 文档:
该
find()
方法返回数组中满足提供的测试函数的第一个元素的值。否则返回未定义。
在这种情况下
res.find(user => user.name === 'alex')
如果任何用户名与alex匹配,或者没有任何属性匹配,则将返回一个用户对象。undefined
user.name
alex
undefined
在条件中计算为false
和用户对象计算为true
。
请记住,您正在将字符串与 进行比较===
,因此,例如,Alex
将不匹配alex
,如果您想研究其他比较字符串的方法,请查看此问题。
您可能还想处理错误,如何处理它们取决于您,这取决于响应,但您可以error
像这样访问您的订阅内部:
this.http.get(SERVER_URL).subscribe(res => {
if (res.find(user => user.name === 'alex')) {
console.log ('Username has been taken');
} else {
console.log('Username is available');
}
}, error => {
console.log(error);
}, () => {
// There is also a 'complete' handler that triggers in both cases
});
编辑。API 返回Object
不array
如果您的 API 在您的问题中返回 anObject
而不是array
like,您仍然可以遍历属性
this.http.get(SERVER_URL).subscribe(res => {
// If successful, res is an array with user data like the following
// {
// key1: {name: "John", age: 21},
// key2: {name: "Thomas", age: 25},
// ...
// }
let match = false;
Object.keys(res).forEach(key => {
if (res[key].name === 'alex') {
match = true;
}
});
if (match) {
console.log ('Username has been taken');
} else {
console.log('Username is available');
}
});
代替Object.keys()你可以使用Object.values()来获取一个包含用户对象的数组,然后find()
像以前一样使用,但这似乎效率较低,如下所示:
if (Object.values(res).find(user => user.name === 'alex')) {
console.log ('Username has been taken');
} else {
console.log('Username is available');
}
推荐阅读
- sql - SQL 运行总秒数 - 时间戳/值
- spring-integration - 使用 Spring Boot 2 启用 MessageHistory 时无法发送 kafka 消息
- sinon - 我可以使用带有 sinon.assert.callWith 的自定义匹配器吗?
- ckeditor - 第一次提交时未提交 CKEDITOR 字段中的文本
- html - 模板标签内容为空
- r - 为什么 data.table 连接不适用于日期?
- excel - vba Application.OnKey F3 在单元格上写入和光标闪烁期间按键盘不起作用
- php - 在创建职业解决方案时,我在数据库 laravel 中获得了 0 值
- python - 如何使用 python.pathlib.Path 在根目录中创建目录?
- highcharts - 除非数据点超过最小/最大网格线,否则如何停止 Highcharts 在图表的末端创建新的网格线?