как фильтровать массив, когда я использую массив в формате geojson

#javascript #arrays

Вопрос:

у меня есть массив , и я хочу отфильтровать массив с помощью BHID.

 let array = [
{ 
 "type": "Feature",   
 "properties": 
        {
        "PID": 0, "SID": 2, "BHID": 1,
        }
},
{ 
 "type": "Feature",   
 "properties": 
        {
        "PID": 0, "SID": 8, "BHID": 2,
        },
},
{ 
 "type": "Feature",   
 "properties": 
        {
        "PID": 0, "SID": 5, "BHID": 1,
        },
}

]
 

а затем я пытаюсь отфильтровать массив по BHID:

     for (let id = 0; id < maxId   1; id  ) {
      let entriesWithID = array.filter((entry) => {
        entry.properties.BHID === id;
      for (let i = 0; i < entriesWithID.length; i  ) {
        console.log(entriesWithID[i]);
         }
      });
 

Но я не могу получить правильный результат, что я должен сделать, чтобы получить правильный результат.

Комментарии:

1. Это for (let i = 0; i < entriesWithID.length должно быть вне вашей .filter() функции обратного вызова, и вы должны возвращаться с помощью return entry.properties.BHID === id;

2. Если бы я правильно понял, что вы хотите сделать, вы могли бы просто: const filteredArray = array.filter(item => item.properties.BHID <= maxId)

Ответ №1:

Вы можете сохранять результат entriesWithID на каждой итерации в объекте следующим образом:

 const array = [
  { 
    "type": "Feature",   
    "properties": { "PID": 0, "SID": 2, "BHID": 1 }
  },
  { 
    "type": "Feature",   
    "properties": { "PID": 0, "SID": 8, "BHID": 2 }
  },
  { 
    "type": "Feature",   
    "properties":  { "PID": 0, "SID": 5, "BHID": 1 }
  }
];
const maxId = 2;
const res = {};

for (let id = 0; id < maxId   1; id  ) {
  const entriesWithID = array.filter(entry => entry.properties.BHID === id);
  res[id] = entriesWithID;
}

console.log(res); 

Другой Подход:

Используя Array#reduce , вы можете перебирать array и группировать элементы в объекте BHID по нужному диапазону. Это сохранит только категории, найденные в массиве, без пустых:

 const array = [
  { 
    "type": "Feature",   
    "properties": { "PID": 0, "SID": 2, "BHID": 1 }
  },
  { 
    "type": "Feature",   
    "properties": { "PID": 0, "SID": 8, "BHID": 2 }
  },
  { 
    "type": "Feature",   
    "properties":  { "PID": 0, "SID": 5, "BHID": 1 }
  }
];
const maxId = 2;

const res = array.reduce((acc, item) => {
  const bhId = item.properties.BHID;
  if(bhId >= 0 amp;amp; bhId <= maxId) {
    acc[bhId] = [ ...(acc[bhId] || []), item ];
  }
  return acc;
}, {})

console.log(res); 

Ответ №2:

Вам нужно вернуть проверку логического условия в filter методе.

Документы для этого.

Измените свой код вот так.

 for (let id = 0; id < maxId   1; id  ) {
  let entriesWithID = array.filter((entry) => {
    return entry.properties.BHID === id;
  });