检查对象是否包含值javascript
我有一个从数据库中获取的嵌套对象数组 每个对象都有一个名为MetadataIDString的成员,它是一个字典 例如:检查对象是否包含值javascript,javascript,arrays,Javascript,Arrays,我有一个从数据库中获取的嵌套对象数组 每个对象都有一个名为MetadataIDString的成员,它是一个字典 例如: [{ "customerId": 48, "uploaderId": "markdolenc", "filename": "1.pdf", "createdOn": { "$date": "2020
[{
"customerId": 48,
"uploaderId": "markdolenc",
"filename": "1.pdf",
"createdOn": {
"$date": "2020-08-25T12:06:10.165Z"
},
"lastModified": {
"$date": "2020-08-28T06:16:40.352Z"
},
"deleted": false,
"approved": true,
"classification": 926,
"nextUserId": 0,
"nextRoleId": 0,
"nextFlowItemId": null,
"documentTypeId": 189,
"metadataIdStrings": {
"3968": "A1 Slovenija, d. d.",
"3969": "A1 Slovenija, d. d.",
"3970": "SI60595256",
"3971": "1196332000",
"3972": "Šmartinska cesta 134B",
"3973": "Ljubljana",
"3974": "1000",
"3975": "",
"3976": "",
"3977": "SI56029220050478116",
"3978": "LJBASI2X",
"3979": "NOVA LJUBLJANSKA BANKA D.D.",
"3980": "",
"3981": "LJBASI2X",
"3982": "Kibuba d.o.o.",
"3983": "Kibuba d.o.o.",
"3984": "SI16483324",
"3985": "2036274000",
"3986": "Selo pri Vodicah 11C",
"3987": "Vodice",
"3988": "1217",
"3989": "",
"3990": "",
"3991": "SI56020370258031447",
"3992": "LJBASI2X",
"3993": "NOVA LJUBLJANSKA BANKA D.D.",
"3994": "",
"3995": "",
"3996": "Račun",
"3997": "20290063150",
"3998": "",
"3999": "SISI12901500469116",
"4000": "EUR",
"4001": "29.00",
"4002": "",
"4003": "6.38",
"4004": "0.00",
"4005": "35.38",
"4006": "2020-05-05",
"4007": "EUR",
"4008": "",
"4009": "",
"4010": "",
"4011": "",
"4012": "",
"4013": "",
"4014": "",
"4015": "",
"4016": "",
"4017": "",
"4018": "",
"4019": "",
"4020": ""
}
}]
我需要根据搜索字段筛选MetadataIDString中包含值的对象
我面临的问题是,字典中的键对于所有对象都不相同
我猜我可以做一些像
filteredList(){
var searchValue = this.search;
return this.correctDocuments.filter(doc => {
return Object.values(doc.metadataIdStrings).some(val => {
var includes = val.toLowerCase().includes(searchValue.toLowerCase())
return includes
})
})
}
但这并没有真正起作用,我错过了什么
编辑:
正如Peter建议的那样,我进一步调试了this.correctDocuments.filter,并注意到它返回了正确的项。问题是我在一个表中绑定了这个.search的数据,它在表中搜索文件名。
愚蠢的错误。也许你能做到这些
// Grab the metadataIdStrings
const { metadataIdStrings } = response
// Convert metadataIdStrings object as an array
Object.values(metadataIdStrings).filter(value => { /* add your filter logic here */ })
// If you need the keys
Object.keys(metadataIdStrings).filter(key => { /* metadataIdStrings[key] === something */ })
此外,从中获取MetadataIDString的数组似乎是一个包含单个对象的数组。所以你应该正确地引用它。也许你可以这样做
// Grab the metadataIdStrings
const { metadataIdStrings } = response
// Convert metadataIdStrings object as an array
Object.values(metadataIdStrings).filter(value => { /* add your filter logic here */ })
// If you need the keys
Object.keys(metadataIdStrings).filter(key => { /* metadataIdStrings[key] === something */ })
此外,从中获取MetadataIDString的数组似乎是一个包含单个对象的数组。所以你应该正确地引用它。所以这是相当直接的。我们需要做的第一件事是获取MetadataIDString对象的键。完成后,我们就可以使用forEach函数对键集进行迭代。在if子句中,我们检查是否存在任何内容,否则将跳过它
const searchValue = this.search;
const {metadataIdStrings} = searchValue;
const keys = Object.keys(metadataIdStrings); // gets the keys
keys.forEach(key=>{
if(metadataIdStrings[key]){
// Do stuff here
console.log(metadataIdStrings[key])
}// else skipping
})
所以这是相当直截了当的。我们需要做的第一件事是获取MetadataIDString对象的键。完成后,我们就可以使用forEach函数对键集进行迭代。在if子句中,我们检查是否存在任何内容,否则将跳过它
const searchValue = this.search;
const {metadataIdStrings} = searchValue;
const keys = Object.keys(metadataIdStrings); // gets the keys
keys.forEach(key=>{
if(metadataIdStrings[key]){
// Do stuff here
console.log(metadataIdStrings[key])
}// else skipping
})
让我们先来看看一些简单但接近您的示例的工作:
var items = [{
"3968": "A1 Slovenija, d. d.",
"3969": "A1 Slovenija, d. d.",
"3970": "SI60595256",
"3971": "1196332000",
"3972": "Šmartinska cesta 134B",
"3973": "Ljubljana",
"3974": "1000",
"3975": "",
"3976": "",
"3977": "SI56029220050478116",
"3978": "LJBASI2X",
"3979": "NOVA LJUBLJANSKA BANKA D.D.",
"3980": "",
"3981": "LJBASI2X",
"3982": "Kibuba d.o.o.",
"3983": "Kibuba d.o.o.",
"3984": "SI16483324",
"3985": "2036274000",
"3986": "Selo pri Vodicah 11C",
"3987": "Vodice",
"3988": "1217",
"3989": "",
"3990": "",
"3991": "SI56020370258031447",
"3992": "LJBASI2X",
"3993": "NOVA LJUBLJANSKA BANKA D.D.",
"3994": "",
"3995": "",
"3996": "Račun",
"3997": "20290063150",
"3998": "",
"3999": "SISI12901500469116",
"4000": "EUR",
"4001": "29.00",
"4002": "",
"4003": "6.38",
"4004": "0.00",
"4005": "35.38",
"4006": "2020-05-05",
"4007": "EUR",
"4008": "",
"4009": "",
"4010": "",
"4011": "",
"4012": "",
"4013": "",
"4014": "",
"4015": "",
"4016": "",
"4017": "",
"4018": "",
"4019": "",
"4020": ""
},
{
"continent": "EUR"
},
{something: "else"}];
我暂时忽略了MetadataIDString相关的东西。运行
items.filter((item) => Object.keys(item).filter((k) => (item[k] && item[k].indexOf("EUR") >= 0)).length)
将产生正确的结果
现在,让我们将此应用于您的案例:
items.filter((item) => item.metadataIdStrings && Object.keys(item.metadataIdStrings).filter((k) => (item.metadataIdStrings[k] && item.metadataIdStrings[k].indexOf("EUR") >= 0)).length)
让我们先来看看一些简单但接近您的示例的工作:
var items = [{
"3968": "A1 Slovenija, d. d.",
"3969": "A1 Slovenija, d. d.",
"3970": "SI60595256",
"3971": "1196332000",
"3972": "Šmartinska cesta 134B",
"3973": "Ljubljana",
"3974": "1000",
"3975": "",
"3976": "",
"3977": "SI56029220050478116",
"3978": "LJBASI2X",
"3979": "NOVA LJUBLJANSKA BANKA D.D.",
"3980": "",
"3981": "LJBASI2X",
"3982": "Kibuba d.o.o.",
"3983": "Kibuba d.o.o.",
"3984": "SI16483324",
"3985": "2036274000",
"3986": "Selo pri Vodicah 11C",
"3987": "Vodice",
"3988": "1217",
"3989": "",
"3990": "",
"3991": "SI56020370258031447",
"3992": "LJBASI2X",
"3993": "NOVA LJUBLJANSKA BANKA D.D.",
"3994": "",
"3995": "",
"3996": "Račun",
"3997": "20290063150",
"3998": "",
"3999": "SISI12901500469116",
"4000": "EUR",
"4001": "29.00",
"4002": "",
"4003": "6.38",
"4004": "0.00",
"4005": "35.38",
"4006": "2020-05-05",
"4007": "EUR",
"4008": "",
"4009": "",
"4010": "",
"4011": "",
"4012": "",
"4013": "",
"4014": "",
"4015": "",
"4016": "",
"4017": "",
"4018": "",
"4019": "",
"4020": ""
},
{
"continent": "EUR"
},
{something: "else"}];
我暂时忽略了MetadataIDString相关的东西。运行
items.filter((item) => Object.keys(item).filter((k) => (item[k] && item[k].indexOf("EUR") >= 0)).length)
将产生正确的结果
现在,让我们将此应用于您的案例:
items.filter((item) => item.metadataIdStrings && Object.keys(item.metadataIdStrings).filter((k) => (item.metadataIdStrings[k] && item.metadataIdStrings[k].indexOf("EUR") >= 0)).length)
到目前为止,这两种方法和代码看起来都是可行的。您认为失败案例的实际搜索值是多少?观众对此也一无所知。correctDocuments将被Object.valuesdoc.MetadataIDString.some的结果过滤。事实上,一切都好。如果我尝试搜索像love或Sloven这样的东西,我会得到0个结果。也许你先尝试自己调试代码,例如A1 Slovenija,d。d、 .toLowerCase。包括“slove”。toLowerCase返回预期结果。下一步是测试外部结构。。。2分钟后。。。选中的。。。Object.valuesdoc.metadataIdStrings.someval=>{const includes=val.toLowerCase.includes'Slove'.toLowerCase;return includes};按预期返回true。那么这个.correctDocuments.filter呢,我已经在第一个地方提到过了?@PeterSeliger我仔细检查了一下,你是对的,返回的结果和预期的一样,所以我将尝试进一步调试这个.correctDocuments.filter。我编辑了原始问题,并设法解决了问题。到目前为止,这两种方法和代码看起来都是可行的。您认为失败案例的实际搜索值是多少?观众对此也一无所知。correctDocuments将被Object.valuesdoc.MetadataIDString.some的结果过滤。事实上,一切都好。如果我尝试搜索像love或Sloven这样的东西,我会得到0个结果。也许你先尝试自己调试代码,例如A1 Slovenija,d。d、 .toLowerCase。包括“slove”。toLowerCase返回预期结果。下一步是测试外部结构。。。2分钟后。。。选中的。。。Object.valuesdoc.metadataIdStrings.someval=>{const includes=val.toLowerCase.includes'Slove'.toLowerCase;return includes};按预期返回true。那么这个.correctDocuments.filter呢,我刚才已经提到过了?@PeterSeliger我仔细检查了一下,你是对的,返回值和预期的一样,所以我将尝试进一步调试这个.correctDocuments.filter我编辑了原始问题,并设法解决了这个问题。我只粘贴了一个带有单个对象的数组,其中可以有n个对象作为示例。所有对象都具有相同的结构,只有MetadataIDString中的内容不同。数组中的所有对象的键都不相同。是否尝试使用正则表达式而不是string.includes?如果您可以共享一些错误消息,或者尝试调试失败的代码,这样我们就可以看到出现了什么问题。没有错误消息,我只是没有得到任何结果,即使metadataIdStringsI中有3个文档包含该字符串,但我只粘贴了一个带有单个对象的数组。例如,可以有n个。所有对象都具有相同的结构,只有MetadataIDString中的内容不同。对于数组中的所有对象,键不相同。是否有
您尝试使用正则表达式而不是string.includes?如果您可以共享一些错误消息,或者尝试调试失败的代码,这样我们就可以看到出现了什么问题。没有错误消息,我只是没有得到任何结果,即使metadataIdStringsI中有3个文档包含该字符串,我也很高兴知道投票失败的原因。如果这是我的答案中的一个缺陷,我会很乐意改进它。但是没有评论,很难说。我很高兴知道投票被否决的原因。如果这是我的答案中的一个缺陷,我会很乐意改进它。但如果没有评论,很难说。