Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
1

Поиск в массиве через цикл

14.04.2013, 01:00. Показов 3267. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер.

Имеются у нас такие данные:
Javascript
1
2
3
var str = "A=1111&B=2222&C=3333"; // исходная строка
var str_array = str.split("&"); // разбираем строку и помещаем в массив. Всего в массиве, три элемента
var mask_array = ["A=", "B=", "C="];
Здесь, мы разобрали строку и поместили в массив. Всего в массиве получилось 3 элемента. Так же мы обьявили массив с маской. Вопрос. Как с помощью цикла, найти и удалить элементы в массиве, используя маску?

Я использовал такой вариант, без маски(громоздкий):

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var str = "A=1111&B=2222&C=3333";
var str_array = str.split("&");
var size = str_array.length;
for(var i = 0; i < size; i++) {
   if(str_array.indexOf("A=") != -1) {
      str_array.splice(i, 1);
      i--;
      size--;
   }
   if(str_array.indexOf("B=") != -1) {
      str_array.splice(i, 1);
      i--;
      size--;
   }
   if(str_array.indexOf("C=") != -1) {
      str_array.splice(i, 1);
      i--;
      size--;
   }
}
Этот вариант, какой-то громоздкий, как мне показалось. Наверняка можно сделать проще. Используя find() например.

Добавлено через 4 часа 27 минут
Найден оптимальный вариант:

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var str = "A=1111&B=2222&C=3333&D=13123";
var str_array = str.split("&");
 
var mask = ["A=", "B=", "C="];
var mask_size = mask.length;
 
for(var i = 0; i < str_array.length; i++) {
      for(var n = 0; n < mask_size; n++) {
          if(str_array[i].indexOf(mask[n]) != -1) {
               str_array.splice(i, 1);
               i--;
               break;
          }
      }
}
Или такой вариант, без дополнительного массива с маской:
Javascript
1
2
3
4
5
6
7
8
9
var str = "A=1111&B=2222&C=3333&D=13123";
var str_array = str.split("&");
 
for(var i = 0; i < str_array.length; i++) {
    if(str_array[i].indexOf("A=") != -1 || str_array[i].indexOf("B=") != -1 || str_array[i].indexOf("C=") != -1) {
        str_array.splice(i, 1);
        i--;
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.04.2013, 01:00
Ответы с готовыми решениями:

Поиск максимального и минимального элементов в массиве за один цикл
Выполните поиск максимального и минимального элементов в массиве за один цикл

Удаление дубликатов в массиве через цикл
using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

Выполнить поиск максимального и минимального элементов в массиве за один цикл
Выполнить поиск максимального и минимального элементов в массиве за один цикл. Смог только в два...

Поиск совершенного числа N через цикл for
Сложить программу с помощью цикла for Задание Дано некоторое число N. Сложить программу поиска...

13
Просто любитель
626 / 464 / 120
Регистрация: 20.01.2011
Сообщений: 865
Записей в блоге: 2
14.04.2013, 10:51 2
stashappy, задача решается в одну строку.
Javascript
1
2
var str = "A=1111&B=2222&C=3333"; // исходная строка
var str_array = str.split(/&?[A-Z]=/);
Ну второй строкой ещё можно удалить пустой первый элемент.
0
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
14.04.2013, 14:38  [ТС] 3
Цитата Сообщение от GuardCat Посмотреть сообщение
stashappy, задача решается в одну строку.
Javascript
1
2
var str = "A=1111&B=2222&C=3333"; // исходная строка
var str_array = str.split(/&?[A-Z]=/);
Ну второй строкой ещё можно удалить пустой первый элемент.
GuardCat.Вы точно поняли суть задачи? Задача состоит в том, чтобы перебрать элементы в исходном массиве и удалить те элементы, в которых есть совпадения по маске. Заметьте, удалить, а не обрезать.
Javascript
1
2
var str = "A=1111&B=2222&C=3333"; // эта строка может содержать и большее количество пар ключ=значение
var mask = ["A=", "B=", "C="]; // маска по условию не изменяется
Ваш код, вырезает кличи, и оставляет значения. Но в массив, согласно условию, должны входить пары ключ=значение.
0
128 / 125 / 39
Регистрация: 11.04.2010
Сообщений: 255
14.04.2013, 17:28 4
Цитата Сообщение от stashappy Посмотреть сообщение
Задача состоит в том, чтобы перебрать элементы в исходном массиве и удалить те элементы, в которых есть совпадения по маске. Заметьте, удалить, а не обрезать.
Напишите пример массива, маски и того, что должно получиться на выходе.
0
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
14.04.2013, 18:12  [ТС] 5
Javascript
1
2
3
4
var str = "A=1111&B=2222&C=3333&D=13123";
var str_array = str.split("&"); // пример массива
var mask = ["A=", "B=", "C="]; // маска
// остается на выходе D=13123
Строка, может быть и такой: "A=1111&B=2222" и такой: "A=1111&B=2222&C=3333&D=13123&E=4444&F=55555". Конечный вариант здесь, может быть разным.
0
Просто любитель
626 / 464 / 120
Регистрация: 20.01.2011
Сообщений: 865
Записей в блоге: 2
14.04.2013, 18:17 6
Цитата Сообщение от stashappy Посмотреть сообщение
GuardCat.Вы точно поняли суть задачи?
Каюсь — грешен, неверно понял задачу.
Ваш подход с маской в массиве мне кажется неверным. Для этого есть регВыр. Если верно понял со второго раза: есть массив строк вида "A=1928", получить нужно массив без элементов, чья левая часть совпала с маской. Я делал бы так:
Javascript
1
2
3
4
5
var
  strArr = "A=1111&B=2222&C=3333&D=3432312&E=23213".split("&"),
  maskReg = /[A-C]=/
;
strArr = strArr.filter( function(n) { return maskReg.test(n) } );
1
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
14.04.2013, 18:21  [ТС] 7
Каюсь — грешен, неверно понял задачу.
Да нет, ничего страшного. Вариант отличный. Надо протестить...
0
Просто любитель
626 / 464 / 120
Регистрация: 20.01.2011
Сообщений: 865
Записей в блоге: 2
14.04.2013, 18:25 8
Пардон,
Javascript
1
maskReg = /^[A-C]=/
1
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
14.04.2013, 18:30  [ТС] 9
GuardCat. Ваш вариант, работает с точностью до наоборот. Он ищет совпадения по регулярному выражению, а все остальное отсекает. Как переделать, чтобы наоборот? И, жаль, что array.filter() не поддерживается IE.
0
Просто любитель
626 / 464 / 120
Регистрация: 20.01.2011
Сообщений: 865
Записей в блоге: 2
14.04.2013, 18:32 10
Да что ж такое-то со мной сегодня! Вот так верно:
Javascript
1
maskReg = /[^A-C]=/
1
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
14.04.2013, 18:42  [ТС] 11
Цитата Сообщение от GuardCat Посмотреть сообщение
Да что ж такое-то со мной сегодня! Вот так верно:
Javascript
1
maskReg = /[^A-C]=/
Этот вариант работает как надо. Отсекает по регулярке, все остальное остается. Но в IE, все же этот вариант работать не будет.
0
Просто любитель
626 / 464 / 120
Регистрация: 20.01.2011
Сообщений: 865
Записей в блоге: 2
14.04.2013, 18:48 12
Цитата Сообщение от stashappy Посмотреть сообщение
И, жаль, что array.filter() не поддерживается IE.
С IE10 поддерживается. Для старичков можно костыль на скорую руку соорудить...
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (!("filter" in Array())) {
  Array.prototype.filter = function( callback ) {
    var x, resultArr = [];
    for (x = 0; x < this.length; x++) {
      if ( callback(this[x], x, this) ) {
        resultArr.push( this[x] );
      }
    }
    return resultArr
  }
}
var
  strArr = "A=1111&B=2222&C=3333&D=3432312&E=23213".split("&"),
  maskReg = /[^A-C]=/
;
strArr = strArr.filter( function(n) { return maskReg.test(n) } );
Добавлено через 4 минуты
А для разработки рекомендую вот эту библиотечку. И можно спокойно использовать большую часть современного js.
1
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
14.04.2013, 18:51  [ТС] 13
Вариант отличный. Благодарю. Думаю людям пригодится. Раз уж мы дошли до регулярных выражений... А что если нам надо отсечь, скажем, не "A=, B=, C=", а например "B=, F=, W=". Как переделать регулярку?
0
Просто любитель
626 / 464 / 120
Регистрация: 20.01.2011
Сообщений: 865
Записей в блоге: 2
14.04.2013, 18:54 14
Вот так:
Javascript
1
maskReg = /[^BFW]=/
1
14.04.2013, 18:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2013, 18:54
Помогаю со студенческими работами здесь

Найти номер минимального элемента в массиве через цикл
function = seco( D,min,max,Pmin ) =size (D) for k=1:n; max =D(k,1); for j=1:m; ...

Как через цикл обойти вокруг ячейки в двумерном массиве?
Собственно, сабж. Мне нужно изменить значения в массиве char вокруг ячейки. Можно ли так сделать?...

Поиск максимального элемента заданной последовательности чисел, через цикл Repeat
Поиск максимального элемента заданной последовательности чисел через цикл Repeat. Помогите...

Подскажите как реализовать поиск максимального числа через цикл в методе?
Попалась мне задача по поиску максимального числа, сперва я сделал для двух потом для трех. Но это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru