Как преобразовать 1 в true или 0 в false при выборке модели
У меня есть модель, которая установлена с ответом JSON из базы данных MySQL. Данные модели устанавливаются с истинным или ложным значением в логическое поле /tinyint в базе данных, которое использует 1
или 0
.
На мой взгляд, у меня есть привязка, которая проверяет логическое значение с подчеркиванием _.isBoolean
. Конечно, когда моя модель получает данные, ей _.isBoolean
1
или 0
вместо true или false, и проверка _.isBoolean
не выполняется.
В любом случае, правильно ли мой ответ JSON от mysql будет иметь логическое значение true или false вместо 1
или 0
, или, предпочтительно, есть ли способ обновить мою модель при извлечении (и перед отображением представления), чтобы привести true
или false
на основе этого 1 или 0 свойства?
например, мои данные модели выглядят как {"isChecked":"1"}
когда мне нужно, чтобы они были {"isChecked":true}
Большое спасибо за любые предложения, которые вы можете иметь!
Ответы
Ответ 1
Все, что вам нужно, это преобразовать string
в int
с помощью +
и преобразовать результат в boolean с помощью !!
:
var response = {"isChecked":"1"};
response.isChecked = !!+response.isChecked
Вы можете выполнить эту манипуляцию в методе parse
:
parse : function (response) {
response.isChecked = !!+response.isChecked;
return response;
}
Ответ 2
Используйте double not:
!!1 = true;
!!0 = false;
obj.isChecked = !!parseInt(obj.isChecked);
Ответ 3
Здесь еще один вариант, который длиннее, но может быть более читаемым:
Boolean(Number("0")); // false
Boolean(Number("1")); // true
Ответ 4
Присвоение сопоставления со значением свойства
JavaScript
Вы можете назначить сравнение свойства "1"
obj["isChecked"] = (obj["isChecked"]==="1");
Это только оценивает значение String "1"
. Другие переменные evaulate to false, как фактический typeof number
будет ложным. (т.е. obj["isChecked"]=1
)
Если вы хотите быть безразличным относительно "1"
или 1
, вы можете использовать:
obj["isChecked"] = (obj["isChecked"]=="1");
Вывод результатов
console.log(obj["isChecked"]==="1"); // true
console.log(obj["isChecked"]===1); // false
console.log(obj["isChecked"]==1); // true
console.log(obj["isChecked"]==="0"); // false
console.log(obj["isChecked"]==="Elephant"); // false
PHP
Та же концепция в PHP
$obj["isChecked"] = ($obj["isChecked"] == "1");
Те же ограничения оператора, что указаны выше для JavaScript, применяются.
Двойной не
Также работает "double not". Это запутывает, когда люди сначала читают его, но он работает на обоих языках для значений типа integer/number. Однако он не работает в JavaScript для значений типа строки, поскольку они всегда оценивают значение true:
JavaScript
!!"1"; //true
!!"0"; //true
!!1; //true
!!0; //false
!!parseInt("0",10); // false
PHP
echo !!"1"; //true
echo !!"0"; //false
echo !!1; //true
echo !!0; //false
Ответ 5
Преобразуйте 1
'1'
и 'true'
в true
а 0
'0'
'false'
null
и undefined
в false
function primitiveToBoolean(value: string | number | boolean | null | undefined): boolean {
if (value === 'true') {
return true;
}
return typeof value === 'string'
? !!+value // we parse string to number first
: !!value;
}
Вот тестовый модуль:
describe('primitiveToBoolean', () => {
it('should be true if its 1 / "1" or "true"', () => {
expect(primitiveToBoolean(1)).toBe(true);
expect(primitiveToBoolean('1')).toBe(true);
expect(primitiveToBoolean('true')).toBe(true);
});
it('should be false if its 0 / "0" or "false"', () => {
expect(primitiveToBoolean(0)).toBe(false);
expect(primitiveToBoolean('0')).toBe(false);
expect(primitiveToBoolean('false')).toBe(false);
});
it('should be false if its null or undefined', () => {
expect(primitiveToBoolean(null)).toBe(false);
expect(primitiveToBoolean(undefined)).toBe(false);
});
it('should pass through booleans - useful for undefined checks', () => {
expect(primitiveToBoolean(true)).toBe(true);
expect(primitiveToBoolean(false)).toBe(false);
});
});
Рецепт TypeScript: элегантный логический анализ