简体   繁体   English

如何检查 object 数组中的数组中是否存在值?

[英]How to check if a value exists in an array in an object array?

I have an object in which extended address information (street name, zip code, house number, etc.).我有一个 object,其中包含扩展地址信息(街道名称、zip 代码、门牌号等)。 I need to check for the existence of a street, a house, and if they do not exist, display an error.我需要检查街道、房子是否存在,如果它们不存在,则显示错误。 The array is below:数组如下:

const obj = {
    "address_components": [
      {
        "long_name": "10",
        "short_name": "100",
        "types": [
          "street_number"
        ]
      },
      {
        "long_name": "Engelsa street",
        "short_name": "Engelsa street",
        "types": [
          "route"
        ]
      },
      {
        "long_name": "Saint-Petersburg",
        "short_name": "SPB",
        "types": [
          "locality",
          "political"
        ]
      },
      {
        "long_name": "Russia",
        "short_name": "RU",
        "types": [
          "country",
          "political"
        ]
      },
      {
        "long_name": "194017",
        "short_name": "194017",
        "types": [
          "postal_code"
        ]
      }
    ],
    "formatted_address": "Engelsa street, 100, Saint-Petersburg, Russia, 194017",
  } 

You can search the address components array for some element entry that has a types array with every value you want it to contain.您可以在地址组件数组中搜索某些元素条目,该元素条目具有types数组,其中包含您希望它包含的每个值。

obj.address_components.some(({ types }) =>
  types.every((type) => [/* list of keys */].includes(type))
);

 const obj = { address_components: [ { long_name: "10", short_name: "100", types: ["street_number"] }, { long_name: "Engelsa street", short_name: "Engelsa street", types: ["route"] }, { long_name: "Saint-Petersburg", short_name: "SPB", types: ["locality", "political"] }, { long_name: "Russia", short_name: "RU", types: ["country", "political"] }, { long_name: "194017", short_name: "194017", types: ["postal_code"] } ], formatted_address: "Engelsa street, 100, Saint-Petersburg, Russia, 194017" }; const res = obj.address_components.some(({ types }) => types.every(type => ['country', 'locality'].includes(type))); const res2 = obj.address_components.some(({ types }) => types.every(type => ['country', 'political'].includes(type))); console.log("'country', 'locality'", res); console.log("'country', 'political'", res2);

If you want to search that every key term is included by some element then use:如果您想搜索某个元素是否包含每个关键术语,请使用:

[/* list of keys */].every((key) =>
  obj.address_components.some(({ types }) => types.includes(key))
);

 const obj = { address_components: [ { long_name: "10", short_name: "100", types: ["street_number"] }, { long_name: "Engelsa street", short_name: "Engelsa street", types: ["route"] }, { long_name: "Saint-Petersburg", short_name: "SPB", types: ["locality", "political"] }, { long_name: "Russia", short_name: "RU", types: ["country", "political"] }, { long_name: "194017", short_name: "194017", types: ["postal_code"] } ], formatted_address: "Engelsa street, 100, Saint-Petersburg, Russia, 194017" }; const res = ["country", "locality"].every((key) => obj.address_components.some(({ types }) => types.includes(key)) ); console.log("'country', 'locality'", res); console.log("'country', 'locality', 'city'", ["country", "locality", "city"].every((key) => obj.address_components.some(({ types }) => types.includes(key)) ));

You could build a function where you pass in the required values and then reduce the types to a single array.您可以构建一个 function 在其中传入所需的值,然后将类型减少为单个数组。 From there you loop over your required values to ensure they are in the actual values:从那里你循环你需要的值以确保它们在实际值中:

 const obj = { "address_components": [{ "long_name": "10", "short_name": "100", "types": [ "street_number" ] }, { "long_name": "Engelsa street", "short_name": "Engelsa street", "types": [ "route" ] }, { "long_name": "Saint-Petersburg", "short_name": "SPB", "types": [ "locality", "political" ] }, { "long_name": "Russia", "short_name": "RU", "types": [ "country", "political" ] }, { "long_name": "194017", "short_name": "194017", "types": [ "postal_code" ] } ], "formatted_address": "Engelsa street, 100, Saint-Petersburg, Russia, 194017", }; function isValidAddress(obj, requiredFields) { // reduce to array of types ['street_number', 'political', ...etc] const actualFields = obj.address_components.reduce((acc, { types }) => { acc.push(...types); return acc; }, []); let valid = true; // loop through the smaller requiredFields to see if its included in the actual requiredFields.forEach((field) => { valid = valid && actualFields.includes(field); }); return valid; } const requiredFields = ['street_number', 'route']; console.log(isValidAddress(obj, requiredFields));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM