Как во время перебора массива удалить из него элементы, не удовлетворяющие условию? [дубликат]

147
29 ноября 2019, 23:00

На данный вопрос уже ответили:

  • Как реализовать поиск по json? 1 ответ

Есть два массива входящий и изменяемый (ну а третий - объект просто используется для наполнения второго, не принципиально).

В рабочем по мере обхода нужно выполнять некоторые функции с его элементами, а после удалять,если те пересеклись с ключами во втором (наполняемом):

//входящий массив, его и будем перебирать 
var filter_items = ["field_type_commece:107", "field_rooms:25", "field_rooms:27", "field_apartment_type:oldbuild"]; 
 
//наполняемый массив 
//одновременно с этим массивам будет сверяться верхний filter_items если в этом массиве есть такие ключи, то надо их верхнего удалить соответствующие элементы 
var url_synonyms = []; 
url_synonyms['field_transaction_type'] = ''; 
url_synonyms['field_catalog'] = ''; 
url_synonyms['field_apartment_type'] = ''; 
url_synonyms['field_type_commece'] = ''; 
 
 
//объект переводов 
var url_items = {} 
url_items.field_transaction_type = {}; 
url_items.field_catalog = {}; 
url_items.field_apartment_type = {}; 
url_items.field_type_commece = {}; 
 
url_items.field_transaction_type['100'] = 'buy'; 
url_items.field_transaction_type['99'] = 'rent'; 
 
url_items.field_catalog['23'] = 'apartment'; 
url_items.field_catalog['93'] = 'room'; 
url_items.field_catalog['24'] = 'house'; 
url_items.field_catalog['68'] = 'commerce'; 
url_items.field_catalog['94'] = 'land'; 
url_items.field_catalog['95'] = 'garage'; 
 
url_items.field_apartment_type['oldbuild'] = 'oldbuild'; 
url_items.field_apartment_type['newbuild'] = 'newbuild'; 
 
url_items.field_type_commece['96'] = 'office'; 
url_items.field_type_commece['97'] = 'merchant'; 
url_items.field_type_commece['98'] = 'stock'; 
url_items.field_type_commece['102'] = 'production'; 
url_items.field_type_commece['104'] = 'ready-business'; 
url_items.field_type_commece['105'] = 'free-room'; 
url_items.field_type_commece['106'] = 'сar-service'; 
url_items.field_type_commece['107'] = 'hotel'; 
 
filter_items.forEach(function(item, key) { 
  var f_item_arr = item.split(':'); 
  if (url_synonyms.indexOf(f_item_arr[0]) != -1) { 
    filter_items.splice(key, 1); 
    url_synonyms[f_item_arr[0]] = '/' + url_items[f_item_arr[0]][f_item_arr[1]]; 
  } 
}) 
console.log(filter_items);

Но по мере обхода второй массив изменяется и из за этого ключи не соответствуют реальным позициям в массиве.

Как изменить код, чтобы из второго массива удалились все элементы, которые пересеклись с первым

Answer 1

Наверное вот так:

//входящий массив, его и будем перебирать 
var filter_items = ["field_type_commece:107", "field_rooms:25", "field_rooms:27", "field_apartment_type:oldbuild"]; 
 
//наполняемый массив 
//одновременно с этим массивам будет сверяться верхний filter_items если в этом массиве есть такие ключи, то надо их верхнего удалить соответствующие элементы 
var url_synonyms = {}; 
url_synonyms['field_transaction_type'] = ''; 
url_synonyms['field_catalog'] = ''; 
url_synonyms['field_apartment_type'] = ''; 
url_synonyms['field_type_commece'] = ''; 
 
 
//объект переводов 
var url_items = {} 
url_items.field_transaction_type = {}; 
url_items.field_catalog = {}; 
url_items.field_apartment_type = {}; 
url_items.field_type_commece = {}; 
 
url_items.field_transaction_type['100'] = 'buy'; 
url_items.field_transaction_type['99'] = 'rent'; 
 
url_items.field_catalog['23'] = 'apartment'; 
url_items.field_catalog['93'] = 'room'; 
url_items.field_catalog['24'] = 'house'; 
url_items.field_catalog['68'] = 'commerce'; 
url_items.field_catalog['94'] = 'land'; 
url_items.field_catalog['95'] = 'garage'; 
 
url_items.field_apartment_type['oldbuild'] = 'oldbuild'; 
url_items.field_apartment_type['newbuild'] = 'newbuild'; 
 
url_items.field_type_commece['96'] = 'office'; 
url_items.field_type_commece['97'] = 'merchant'; 
url_items.field_type_commece['98'] = 'stock'; 
url_items.field_type_commece['102'] = 'production'; 
url_items.field_type_commece['104'] = 'ready-business'; 
url_items.field_type_commece['105'] = 'free-room'; 
url_items.field_type_commece['106'] = 'сar-service'; 
url_items.field_type_commece['107'] = 'hotel'; 
 
filter_items = filter_items.filter(function(item) { 
  var f_item_arr = item.split(':'); 
  let conatins = url_synonyms[f_item_arr[0]] !== undefined; 
  if (conatins)  
    url_synonyms[f_item_arr[0]] = '/' + url_items[f_item_arr[0]][f_item_arr[1]]; 
  return conatins; 
}) 
console.log(filter_items); 
console.log(url_synonyms);

Answer 2

Для этого есть Array.filter

var fruits = ['Яблоки', 'Груши', 'Бананы', 'Апельсины', 'Мандарины', 'Гранаты']; 
var del_els = ['Апельсины', 'Орехи', 'Помидоры', 'Груши', 'Яблоки', 'Вишня']; 
del_els = del_els.filter(function(item, key) { 
   return !~fruits.indexOf(item) 
}) 
console.log(fruits); 
console.log(del_els);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>

READ ALSO
Не получается установить Webpack

Не получается установить Webpack

Пытаюсь установить webpack

132
Network Error при запросе на сервер через Axios

Network Error при запросе на сервер через Axios

код запроса на клиенте , тестирую на локалке (подключаюсь к localhost:4000) :

124
Как получить response, используя $.postJson()

Как получить response, используя $.postJson()

Задача состоит в получении ответа, используя IJavaScriptExecutor и метод $postJson() Реализация следующая

137