Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查对象是否包含值javascript_Javascript_Arrays - Fatal编程技术网

检查对象是否包含值javascript

检查对象是否包含值javascript,javascript,arrays,Javascript,Arrays,我有一个从数据库中获取的嵌套对象数组 每个对象都有一个名为MetadataIDString的成员,它是一个字典 例如: [{ "customerId": 48, "uploaderId": "markdolenc", "filename": "1.pdf", "createdOn": { "$date": "2020

我有一个从数据库中获取的嵌套对象数组

每个对象都有一个名为MetadataIDString的成员,它是一个字典

例如:

    [{
  "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个文档包含该字符串,我也很高兴知道投票失败的原因。如果这是我的答案中的一个缺陷,我会很乐意改进它。但是没有评论,很难说。我很高兴知道投票被否决的原因。如果这是我的答案中的一个缺陷,我会很乐意改进它。但如果没有评论,很难说。