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);
}
}
}
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
) {}
Самый чистый (и, на мой взгляд, лучший) способ сделать это с блоком 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());
Попробуйте следующее:)
if (
(state.staff.members && state.staff.members.length < 5) ||
(state.staff.departments && state.staff.departments.length < 5)
) {
// do something
}
Для этих сценариев я хотел бы использовать небольшой помощник, подобный этому:
/**
* 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 .
Множество и множество фальшивых проверок
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");
}
try...catch
встроен прямо в JS - вам не нужно засорять ваш код такими вещами, как это
– mhodges
13 July 2018 в 15:54
if
. У меня такое чувство, что оценка 8 выражений будет медленнее, чем позволить try / catch делать свое дело.
– mhodges
13 July 2018 в 16:03
try/catch
. Я могу сделать 832,007,277 , если проверки против 244,517 попытаются / уловить в Chrome. Я могу сделать 1,574,399,733 , если проверяет в Firefox.
– zero298
13 July 2018 в 16:10