поиск внутри дочернего массива объектов - JavaScript - PullRequest
0 голосов
/ 07 сентября 2018

В настоящее время у меня есть ниже Массив объектов

obj = [
    {
        "id":28,
        cities: [
            {
                cityTypes: "AA",
                citySource: "sdsf"
            },
            {
                cityTypes: "BB",
                citySource: "sdsgf"
            },
            {
                cityTypes: "CC",
                citySource: "fgsdfgd"
            }
        ]
    }, 
    {
        "id":56,
        cities: [
            {
                cityTypes: "DD",
                citySource: "sdsf"
            },
            {
                cityTypes: "EE",
                citySource: "sdsgf"
            },
            {
                cityTypes: "FF",
                citySource: "fgsdfgd"
            }
        ]
    }, 
    {
        "id":89,
        cities: [
            {
                cityTypes: "GG",
                citySource: "sdsf"
            },
            {
                cityTypes: "HH",
                citySource: "sdsgf"
            },
            {
                cityTypes: "II",
                citySource: "fgsdfgd"
            }
        ]
    }
]

Мне нужно искать cityTypes конкретного значения присутствует в целом Object.

Предположим, мне нужно найти cityTypes = BB

Если BB присутствует во всем объекте, вернуть true

Если BB не задано, вернуть false.

Это то, что я пробовал, похоже, не работает.

for(let k=0; k<obj.length; k++){
    if(obj[k].cities){
        let cityObj = obj[k].cities;
        for(let city in cityObj){
            city.cityTypes !== "BB" ? "true" : "false"
        }
    }
}

Как правильно достичь этого?

Ответы [ 6 ]

0 голосов
/ 07 сентября 2018

Попробуйте с кодом ниже.

var result = false;
for(let k=0; k<obj.length; k++){
    if(obj[k].cities){
        let cityObj = obj[k].cities;
        for(let city in cityObj){
            if(cityObj[city].cityTypes == "BB"){
                result = true;
            }
        }
    }
}

вернуть результат или распечатать консольный журнал.

0 голосов
/ 07 сентября 2018

Этот короткий метод возвращает true, если хотя бы один из городов имеет требуемый тип:

function findMyCode(code) {
   return obj.some((d) => {
       return d.cities.some((city) => {
           return city.cityTypes === code;
       });
   });
}

Или вы можете попробовать использовать библиотеку lodash .

Так что вы можетеиспользуйте это:

var hasType = findMyCode('BB'); // returns true/false
0 голосов
/ 07 сентября 2018
var filtered = obj.filter((o) => {
    var found=false;
    for(let i=0;  i<o.cities.length; i++) {
        let city = o.cities[i];
        if(city.cityTypes === "BB"){
            found=true;
            break;
        }
    }
    return found;
})
console.log(filtered)
0 голосов
/ 07 сентября 2018

Использование двойного уменьшения должно работать

var obj = [{
    "id": 28,
    cities: [{
        cityTypes: "AA",
        citySource: "sdsf"
      },
      {
        cityTypes: "BB",
        citySource: "sdsgf"
      },
      {
        cityTypes: "CC",
        citySource: "fgsdfgd"
      }
    ]
  },
  {
    "id": 56,
    cities: [{
        cityTypes: "DD",
        citySource: "sdsf"
      },
      {
        cityTypes: "EE",
        citySource: "sdsgf"
      },
      {
        cityTypes: "FF",
        citySource: "fgsdfgd"
      }
    ]
  },
  {
    "id": 89,
    cities: [{
        cityTypes: "GG",
        citySource: "sdsf"
      },
      {
        cityTypes: "HH",
        citySource: "sdsgf"
      },
      {
        cityTypes: "II",
        citySource: "fgsdfgd"
      }
    ]
  }
]
var cityTypes1 = 'BB';
console.log(obj.reduce((total, cur) => 
    total||cur.cities.reduce((total, cur) => 
        total||cur.cityTypes === cityTypes1, false), 
    false))
0 голосов
/ 07 сентября 2018

Ваш существующий код не работает по нескольким причинам:

  1. Вам нужно сделать let city of cityObj, поскольку вы обращаетесь к свойству city как city.cityTypes внутри внутреннего цикла, поэтому использование of даст вам каждый объект в переменной city.
  2. Вы должны фактически проверить, найдено ли совпадение или нет, используя условие if. Если найдено совпадение с cityTypes, которое вы ожидаете, тогда break внутренний цикл. Также break внешний цикл, если совпадение найдено.

var obj = [{
    "id": 28,
    cities: [{
        cityTypes: "AA",
        citySource: "sdsf"
      },
      {
        cityTypes: "BB",
        citySource: "sdsgf"
      },
      {
        cityTypes: "CC",
        citySource: "fgsdfgd"
      }
    ]
  },
  {
    "id": 56,
    cities: [{
        cityTypes: "DD",
        citySource: "sdsf"
      },
      {
        cityTypes: "EE",
        citySource: "sdsgf"
      },
      {
        cityTypes: "FF",
        citySource: "fgsdfgd"
      }
    ]
  },
  {
    "id": 89,
    cities: [{
        cityTypes: "GG",
        citySource: "sdsf"
      },
      {
        cityTypes: "HH",
        citySource: "sdsgf"
      },
      {
        cityTypes: "II",
        citySource: "fgsdfgd"
      }
    ]
  }
]
var found = false;
for (let k = 0; k < obj.length; k++) {
  if (obj[k].cities) {
    let cityObj = obj[k].cities;
    for (let city of cityObj) {
      found = city.cityTypes === "BB";
      if (found) {
        break;
      }
    }
  }
  if (found) {
    break;
  }
}
console.log(found);
0 голосов
/ 07 сентября 2018

Вы можете использовать .some внутри другого .some:

const obj=[{"id":28,cities:[{cityTypes:"AA",citySource:"sdsf"},{cityTypes:"BB",citySource:"sdsgf"},{cityTypes:"CC",citySource:"fgsdfgd"}]},{"id":56,cities:[{cityTypes:"DD",citySource:"sdsf"},{cityTypes:"EE",citySource:"sdsgf"},{cityTypes:"FF",citySource:"fgsdfgd"}]},{"id":89,cities:[{cityTypes:"GG",citySource:"sdsf"},{cityTypes:"HH",citySource:"sdsgf"},{cityTypes:"II",citySource:"fgsdfgd"}]}];

console.log(
  obj.some(({ cities }) => cities.some(({ cityTypes }) => cityTypes === 'BB'))
);
console.log(
  obj.some(({ cities }) => cities.some(({ cityTypes }) => cityTypes === 'foobar'))
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...