Проверьте, не существует ли строка в нескольких массивах

Это метод, который сам Google использует, по крайней мере, в одном примере:

var markers = [];

// Clear out the old markers.
markers.forEach(function(marker) {
  marker.setMap(null);
});
markers = [];

Проверьте образец Google для полного примера кода:

https: // разработчики. google.com/maps/documentation/javascript/examples/places-searchbox

1
задан Brian Gurka 17 January 2019 в 16:04
поделиться

3 ответа

Эффективный подход заключается в использовании ассоциативных массивов bash 4.0:

#!/usr/bin/env bash
case $BASH_VERSION in ''|[123].*) echo "ERROR: Requires bash 4.0+" >&2; exit 1;; esac

declare -A input_fields_list=( [one]=1 [two]=1 [three]=1 [four]=1 [five]=1 )
declare -A req_fields_list=( [one]=1 [six]=1 [seven]=1 [eight]=1 )
declare -A non_input_fields_list=( [two]=1 [three]=1 [seven]=1 [eight]=1 [nine]=1 )

for xfr in "${!input_fields_list[@]}"; do
  [[ ${req_fields_list[$xfr]} ]] && continue
  [[ ${non_input_fields_list[$xfr]} ]] && continue
  echo "$xfr not found" >&2
  exit 1
done

echo "All input fields are valid" >&2
exit 0

Как вы можете видеть на https://ideone.com/IhmVKy , это правильно завершается с five not found.

0
ответ дан Charles Duffy 17 January 2019 в 16:04
поделиться

Например, вы должны выполнить итерацию следующим образом:

#!/bin/bash

INPUT_FIELDS_LIST=( one two three four five)
REQ_FIELDS_LIST=( one six seven eight )
NON_INPUT_FIELDS_LIST=( two three seven eight nine )

for ifl in "${INPUT_FIELDS_LIST[@]}"
do

        for rfl in "${REQ_FIELDS_LIST[@]}"
        do
                myvar=0
                if [[ $ifl == "$rfl" ]]
                then myvar=1; break
                else continue
                fi
        done

        for nifl in "${NON_INPUT_FIELDS_LIST[@]}"
        do
                myvar2=0
                if [[ $ifl == "$nifl" ]]
                then myvar2=1; break
                else continue
                fi
        done

        if [[ $myvar == 1 ]] || [[ $myvar2 == 1 ]]
        then continue
        else echo "$ifl"
        fi

done

Выполнить итерацию по вторичным циклам вручную, а затем пометить их как недействительные.

Оператор if в конце проверяет, было ли сопоставлено какое-либо значение, если оно есть, оно переходит к следующей первичной итерации.

Выход:

four
five
0
ответ дан itChi 17 January 2019 в 16:04
поделиться

Вы можете проверить, находится ли элемент в массиве с чем-то вроде этого, без циклов и не подвержен пробелам в элементах

#! /bin/bash
function elem_in_array() {
    local e="$1"
    shift
    local a=("$@")
    [[ $(printf '\x01%s\x01' "${a[@]}") =~ $(printf '\x01%s\x01' "$e") ]]
}

a1=(A B "C D" E F)
elem_in_array "A" "${a1[@]}" && echo Y || echo N
elem_in_array "B" "${a1[@]}" && echo Y || echo N
elem_in_array "C D" "${a1[@]}" && echo Y || echo N
elem_in_array "AB" "${a1[@]}" && echo Y || echo N
0
ответ дан Diego Torres Milano 17 January 2019 в 16:04
поделиться