Проверить несколько значений в javascript, которые могут не существовать

import java.util.*;
import javax.swing.*;
public class alphanumeric{
    public static void main(String args[]){
        String nval,lenval;
        int n,len;

        nval=JOptionPane.showInputDialog("Enter number of codes you require : ");
        n=Integer.parseInt(nval);

        lenval=JOptionPane.showInputDialog("Enter code length you require : ");
        len=Integer.parseInt(lenval);

        find(n,len);

    }
    public static void find(int n,int length) {
        String str1="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        StringBuilder sb=new StringBuilder(length);
        Random r = new Random();

        System.out.println("\n\t Unique codes are \n\n");
        for(int i=0;i<n;i++){
            for(int j=0;j<length;j++){
                sb.append(str1.charAt(r.nextInt(str1.length())));
            }
            System.out.println("  "+sb.toString());
            sb.delete(0,length);
        }
    }
}
-1
задан Zakaria Acharki 13 July 2018 в 15:41
поделиться

5 ответов

if ((state.staff.members && state.staff.members.length < 5) || (state.staff.departments && state.staff.departments.length < 5)) {}

Предполагается, что вы хотите, чтобы условие проходило только тогда, когда установлено хотя бы одно из свойств.

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

if ((state.staff.members && state.staff.members.length < 5) 
    || (state.staff.departments && state.staff.departments.length < 5)
    || state.staff.hasOwnProperty('members') === false
    || state.staff.hasOwnProperty('departments') === false
) {}
0
ответ дан Jon Wyatt 17 August 2018 в 12:28
поделиться
  • 1
    Извините, мой вопрос не ясен. Если state.staff.members или state.staff.departments не существует, то есть & lt; 5 сотрудников или членов, и поэтому я хотел бы, чтобы функция проходила – user759885 13 July 2018 в 15:55

Самый чистый (и, на мой взгляд, лучший) способ сделать это с блоком try...catch. Таким образом, вы можете безопасно и изящно потерпеть неудачу, если свойства, которые вы ищете, не существуют, например:

var state;

function myFunction() {
  try {
    if (state.staff.members.length < 5 || state.staff.departments.length < 5) {
      return "PASS";
    }
  } catch (e) {
    console.log(e.toString());
    return "PASS"
  }
  return "FAIL";
}

console.log(myFunction());

1
ответ дан mhodges 17 August 2018 в 12:28
поделиться
  • 1
    Если state.staff.members или state.staff.departments не существует, то есть & lt; 5 сотрудников или членов, и поэтому я хотел бы, чтобы функция проходила – user759885 13 July 2018 в 15:57
  • 2
    @ user759885 Обновлено. Это то, что вы ищете? – mhodges 13 July 2018 в 16:00

Попробуйте следующее:)

if (
  (state.staff.members && state.staff.members.length < 5) || 
  (state.staff.departments && state.staff.departments.length < 5)
) {

   // do something

}
-1
ответ дан UtkarshPramodGupta 17 August 2018 в 12:28
поделиться
  • 1
    Если state.staff.members или state.staff.departments не существует, то есть & lt; 5 сотрудников или членов, и поэтому я хотел бы, чтобы функция проходила – user759885 13 July 2018 в 15:57
  • 2
    Ваша функция действительно пройдет. & Quot; & Amp; & Amp; & Quot; оператор не оценивает правый операнд вообще, когда левый операнд является значением ложности, то есть false, undefined, null или like. – UtkarshPramodGupta 13 July 2018 в 16:00

Для этих сценариев я хотел бы использовать небольшой помощник, подобный этому:

/**
 * Accesses nested properties and returns a default value if it encounters null or undefined along the way.
 * @param fallback A fallback value if any property or its value is null or undefined.
 * @param path The path to access a nested property
 */
export const propOrDefault = <T, R>(fallback: R) => (...path: string[]) => (obj: T | null | undefined): R =>
  path.reduce((partialObj, propertyName) => {
    if (partialObj && propertyName && partialObj.hasOwnProperty(propertyName)) {
      return partialObj[propertyName] || fallback;
    }

    return fallback;
  }, obj);

Это TypeScript, но он должен получить точку. Дополнительная информация о типе может помочь с пониманием.

Пример использования:

const isValid = propOrDefault(0)('staff', 'members', 'length')(state) < 5;

Как вы можете видеть, этот помощник использует currying , чтобы вы могли предварительно -конфигурируйте его для последующего использования следующим образом:

const propOrTen = propOrDefault(0);
const countStaffMembers = propOrTen('staff', 'members', 'length');
const result = countStaffMembers(state);

Там есть множество библиотек с подобными инструментами, такими как lodash и ramda .

0
ответ дан Xceno 17 August 2018 в 12:28
поделиться

Множество и множество фальшивых проверок

if (
  (
    state &&
    state.staff &&
    state.staff.members &&
    state.staff.members.length < 5
  ) ||
  (
    state &&
    state.staff &&
    state.staff.departments &&
    state.staff.departments.length < 5
  )
) {
   console.log("foo");
}

Я хотел бы предложить вместо lodash подход с _.get() для инкапсуляции проверок.

if (
    _.get(state, "staff.members.length") < 5 || 
    _.get(state, "staff.departments.length") < 5
){
  console.log("foo");
}
0
ответ дан zero298 17 August 2018 в 12:28
поделиться
  • 1
    try...catch встроен прямо в JS - вам не нужно засорять ваш код такими вещами, как это – mhodges 13 July 2018 в 15:54
  • 2
    @mhodges True, но try/catch кажется медленнее Try / Catch Error Perf – zero298 13 July 2018 в 15:56
  • 3
    3% медленнее с 1 проверкой выражения в вашем заявлении if. У меня такое чувство, что оценка 8 выражений будет медленнее, чем позволить try / catch делать свое дело. – mhodges 13 July 2018 в 16:03
  • 4
    @mhodges Я не получаю 3%, я становлюсь на 100% медленнее, используя try/catch. Я могу сделать 832,007,277 , если проверки против 244,517 попытаются / уловить в Chrome. Я могу сделать 1,574,399,733 , если проверяет в Firefox. – zero298 13 July 2018 в 16:10
  • 5
    @mhodges Ах, мое плохое. Я не использовал последнюю версию. – zero298 13 July 2018 в 16:13
Другие вопросы по тегам:

Похожие вопросы: