How can I determine if an object is empty or not - google-apps-script

I have a situation where I need to determine if an object is empty or not. I cannot figure out the if statement to make this work.
function test_isObjectEmpty(){
var responces = {};
// var responces = {'test':'test'};
var result = "";
if (responces == {}){ // this does not work
result ="Nothing found";
} else {
result ="Responce found";
}
Logger.log(result)
}

You can check the objects length, if 0, it's empty:
var obj = {};
if (Object.getOwnPropertyNames(obj).length === 0) {
//it's empty
}
else {
//it's not empty
}

Related

AngularJS Selects Empty Option Even Valid Option is Avaliable

I'm using AngularJS ver. 1.2.15 on my project. And, I have a select element on one of my views as per below:
<select class="select-white form-control form-select" id="cat2_{{feed.id}}" ng-model="feed.operationstatusid" ng-change="updateCategoryAndStatus(feed, true)"></select>
And, I'm feeding this element like this:
function SetCategory2(cat1Id, feed) {
var feedId = feed.id;
var fromRuleOpStatusId = -1;
$('#cat2_' + feedId).find('option').remove();
if (cat1Id > -1) {
$('#cat2_' + feedId).append($('<option></option>').text(lang.SelectSubCategory).val(0));
$.each($scope.category2, function (index, cat2Item) {
$('#cat2_' + feedId).append($('<option></option>').text(cat2Item.statusdescription).val(cat2Item.id));
});
var isselected = false;
$.each($scope.category2, function (index, cat2Item) {
if (feed.operationstatusid == cat2Item.id) {
$('#cat2_' + feedId).val(cat2Item.id);
fromRuleOpStatusId = -1;
isselected = true;
}
else {
var feedStr = "";
if (feed.title != undefined && feed.title != null) {
feedStr = feed.title.toLowerCase();
}
if ($scope.catTitleRulesTwo) {
$.each($scope.catTitleRulesTwo, function (r_index, r_item) {
if (cat2Item.id == r_item.titleCode && !isselected) {
if (feedStr != undefined && feedStr != null && r_item != undefined && r_item != null) {
String.prototype.contains = function (str) { return this.toLowerCase().indexOf(str) !== -1; };
var text = feedStr;
if (eval(r_item.ruleexpression)) {
$('#cat2_' + feedId).val(cat2Item.id);
fromRuleOpStatusId = cat2Item.id;
isselected = true;
}
}
}
});
}
}
});
if (fromRuleOpStatusId != -1) {
feed.operationstatusid = fromRuleOpStatusId;
}
}
else {
$('#cat2_' + feedId).append($('<option></option>').text(lang.SelectSubCategory).val(0));
}
}
I am aware of the facts about eval function, but the project I'm working on is quite old, so does the code. Anyway, this is about business logic and quite irrelevant with the thing I'm going to ask (or so I was thinking).
As you can see I'm appending all the options before I set the value of the selectbox with using .val(...). I have also checked that values do match along with the data types. But, when I observe this function step by step, I saw that selected value does show up without flaw. After the code finish with my above mentioned function (SetCategory2), code goes through on of the function located on AngularJS file, named xhr.onreadystatechange. It's not a long function, so I'm sharing it also on below.
xhr.onreadystatechange = function() {
if (xhr && xhr.readyState == 4) {
var responseHeaders = null,
response = null;
if(status !== ABORTED) {
responseHeaders = xhr.getAllResponseHeaders();
response = ('response' in xhr) ? xhr.response : xhr.responseText;
}
completeRequest(callback,
status || xhr.status,
response,
responseHeaders);
}
};
After the code released from this function, respective selectbox's value is pointed at the empty option.
I have run into topics which talks about this behaviour might due to invalid option-value match, but as I described above, I append all my options before deciding the value. So, I can't figure out what I'm missing.
Thank you in advance.

Apps Script turn value between functions

Hello everyone)) I have problem with moving value inside th function, please help me
First I have field "allValid" - has taken boolean value "true".
Next I did 3 checking breakpoints in script where this field must change boolean value on "false".
But whatever i do allValid always has "true". I cant understand what am I doing wrong.
function ButtonClickAction(){
let allValid = true;
var UserInfo = {};
UserInfo.zLOGIN = document.getElementById("LOGIN").value;
UserInfo.zSSCC = document.getElementById("SSCC").value;
UserInfo.zPLACE = document.getElementById("PLACE").value;
var toValidate = {
LOGIN: "LOGIN REQUIRED",
SSCC: "SSCC REQUIRED",
PLACE: "PLACE REQUIRED"
}
var idKeys = Object.keys(toValidate);
//first checking
idKeys.forEach(function(id){
isValid = checkIfValid(id,toValidate[id]);
allValid = isValid;
});
//second checking
google.script.run.withSuccessHandler(onLOGIN).searchLogins(UserInfo);
function onLOGIN(findLogin) {
if (!findLogin) {
alert("LOGIN NOT EXIST");
allValid = false;
}
}
//thirdchecking
console.log(allValid);
google.script.run.withSuccessHandler(onSSCC).searchSSCC(UserInfo);
function onSSCC(findSSCC) {
if (!findSSCC) {
alert("SSCC NOT EXIST");
allValid = false;
}
}
//finish result
if (!allValid){
alert("YOU HAVE NOTHING");
}
else {
addRecord(idElem);
}
}
function checkIfValid(elId, message){
var isValid = document.getElementById(elId).checkValidity();
if(!isValid){
alert(message);
return false;
}
return true;
}
At the end of the function "ButtonClickAction" I have "finish result", but it works wrong because allValid has always "true". Help!
(sorry for bad English, it's my non-native language, I try explain correctly)
... and some server code:
var url = "https://docs.google.com/spreadsheets/d/1s8l-8N8dI-GGJi_mmYs2f_88VBcnzWfv3YHgk1HvIh0/edit?usp=sharing";
var sprSRCH = SpreadsheetApp.openByUrl(url);
let sheetSRCHSSCC = sprSRCH.getSheetByName("PUTAWAY_TO");
let sheetTSD = sprSRCH.getSheetByName("ПРИВЯЗКА МЕСТ");
function searchLogins(UserInfo){
let sheetSRCHLGN = sprSRCH.getSheetByName("ЛОГИНЫ");
let findingRLGN = sheetSRCHLGN.getRange("A:A").getValues();
let valToFind = UserInfo.zLOGIN;
for (let i = 0; i < findingRLGN.length; i++){
if(findingRLGN[i].indexOf(valToFind)!==-1){
return true;
}
};
return false;
}
function searchSSCC(UserInfo){
let findingRSSCC = sheetSRCHSSCC.getRange("M:M").getValues();
let valToFind = UserInfo.zSSCС;
for (let i = 0; i < findingRSSCC.length; i++){
if(findingRSSCC[i].indexOf(valToFind)!==-1){
return true;
break;
}
};
indx=2;
return false;
}

Check to see if two strings are anagrams of each other in JavaScript. What logic is used here?

Can someone help explain the logic used in the JavaScript code here?
The code below checks to see if two strings are anagrams of each other, but I don't understand the method being used to check the string.
Thanks.
<script type="text/javascript">
$(document).ready(function() {
var anagram = function(str1, str2){
if (str1.length !== str2.length) {
return false;
}
var sortstr1 = str1.split('').sort().join('');
var sortstr2 = str2.split('').sort().join('');
return (sortstr1 === sortstr2);
}
$('.AnagramChecker').on('click', function(e) {
e.preventDefault();
if($('#string1').val() == '') {
$('#string1').addClass('error');
if($('#string2').val() == '') {
$('#string2').addClass('error');
}
$('.results').empty();
$('.results').hide();
} else {
$('#string1').removeClass('error');
if($('#string2').val() == '') {
$('#string2').addClass('error');
$('.results').empty();
$('.results').hide();
} else {
$('#string2').removeClass('error');
var isAnagram = anagram($('#string1').val(), $('#string2').val());
$('#string1').val('');
$('#string2').val('')
$('.results').show();
$('.results').empty().append('Anagram is: ' + isAnagram);
}
}
});
});
</script>
Both strings are being split down into arrays of their individual characters, which are then sorted alphabetically and joined again into strings. The strings are then compared, and if they are the same, are anagrams of one another.
function anagrams(str1,str2){
//spliting string into array
let arr1 = str1.split("");
let arr2 = str2.split("");
//verifying array lengths
if(arr1.length !== arr2.length){
return false;
}
//creating objects
let frqcounter1={};
let frqcounter2 ={};
// looping through array elements and keeping count
for(let val of arr1){
frqcounter1[val] =(frqcounter1[val] || 0) + 1;
}
for(let val of arr2){
frqcounter2[val] =(frqcounter2[val] || 0) + 1;
}
console.log(frqcounter1);
console.log(frqcounter2);
//loop for every key in first object
for(let key in frqcounter1){
//if second object does not contain same frq count
if(frqcounter2[key] !== frqcounter1[key]){
return false;
}
}
return true;
}
anagrams('anagrams','nagramas');
function compare(a1,a2){
if(a1.length != a2.length){
return false
}
var f1 = {}, f2 ={};
for(var a of a1){
f1[a] = ++f1[a] || 1
}
for(var a of a2){
f2[a] = ++f2[a] || 1
}
for(var key in f1){
if(!(key in f2)){
return false
}
if(f1[key] != f2[key]) {
return false
}
}
return true
}

json stringify in IE 8 gives run time error Object property or method not supported

/* Problem description- I am using json stringify method to convert an javascript array to string in json notation.However I get an error message that 'Object property or method not supported' at line
hidden.value = JSON.stringify(jsonObj);
This should work as stringify is supported in IE8.Please advise
Full code below */
function getgridvalue() {
var exportLicenseId;
var bolGrossQuantity;
var bolNetQuantity;
var totalBolGrossQty =0 ;
var totalBolNetQty =0;
var jsonObj = []; //declare array
var netQtyTextBoxValue = Number(document.getElementById("<%= txtNetQty.ClientID %>").value);
var atLeastOneChecked = false;
var gridview = document.getElementById("<%= ExporterGrid.ClientID %>"); //Grab a reference to the Grid
for (i = 1; i < gridview.rows.length; i++) //Iterate through the rows
{
if (gridview.rows[i].cells[0].getElementsByTagName("input")[0] != null && gridview.rows[i].cells[0].getElementsByTagName("input")[0].type == "checkbox")
{
if (gridview.rows[i].cells[0].getElementsByTagName("input")[0].checked)
{
atLeastOneChecked = true;
exportLicenseId = gridview.rows[i].cells[8].getElementsByTagName("input")[0].value;
bolNetQuantity = gridview.rows[i].cells[5].getElementsByTagName("input")[0].value;
if (bolNetQuantity == "") {
alert('<%= NetQuantityMandatory %>');
return false;
}
if (!isNumber(bolNetQuantity)) {
alert('<%= NetQuantityNumber %>');
return false;
}
totalBolNetQty += Number(bolNetQuantity);
jsonObj.push({ ExportLicenseId: Number(exportLicenseId), BolNetQuantity: Number(bolNetQuantity) });
}
}
}
if (gridview.rows.length > 2 && !atLeastOneChecked)
{
alert('<%= SelectMsg %>');
return false;
}
if (totalBolNetQty != 0 && netQtyTextBoxValue != totalBolNetQty)
{
alert('<%= NetQuantitySum %>');
return false;
}
var hidden = document.getElementById('HTMLHiddenField');
// if (!this.JSON) {
// this.JSON = {};
// }
var JSON = JSON || {};
if (hidden != null) {
hidden.value = JSON.stringify(jsonObj);
}
}
Use the F12 Developer Tools to check the browser mode. The JSON object exists, but has no methods in IE7 mode. Use the json2 library as a fallback.
json2.js

AS3: indexOf() sub-array in a multi-dimensional array

var asdf:Array = [ [1,1] ];
trace( asdf.indexOf( [1,1] ) ); // -1
Why can't indexOf() find the [1,1] array?
Here is a little function I wrote a while ago that works great. I included a lot of comments and an example search/function to output the results.
// set up a multidimensional array that contains some data
var myArray:Array = new Array();
myArray.push(["granola","people... are great"," 4 ","10"]);
myArray.push(["bill","orangutan","buster","keaton"]);
myArray.push(["steve","gates","24","yes, sometimes"]);
myArray.push(["help","dave","jobs","hal"]);
// here we set up some properties on the array object to hold our search string and our results
myArray.myTarget = "steve";
myArray.myResults = [];
// now we call the search
myArray.forEach(multiSearch);
// this is the function that does all the heavy lifting....
function multiSearch(element:*, index:int, array:Array)
{
// see if we have a match in this array and pass back its index
for(var i:* in element)
{
if( element[i].indexOf( array.myTarget ) > -1 )
{
var tempArray:Array = array.myResults;
tempArray.push([index,i]);
array.myResults = tempArray;
}
}
}
// -------------------------------------------------------------------------------
// all the code below is OPTIONAL... it is just to show our results
// in the output window in Flash so you know it worked....
var printArray:Array = myArray.myResults;
for(var i:* in printArray)
{
trace("TARGET FOUND #: "+printArray[i][0]+", "+printArray[i][1]+" = "+myArray[ printArray[i][0] ][ printArray[i][1] ]);
}
// -------------------------------------------------------------------------------
It fails because when you do a [x,y] you are creating a new array, adsf contains one array and indexOf search for another one.
try:
trace([1,1] == [1,1]);
You will see that it prints false, since array are compare by reference.
One quick indexOf function, arrange it to suit your needs:
function isElmEquals(e1:*, e2:*):Boolean {
return (e1==e2);
}
function isArrayEquals(a1:Array, a2:Array):Boolean {
if (a1==a2)
return true;
if ((a1==null) || (a2==null)) {
return false;
}
if (a1.length!=a2.length)
return false;
for (var i:int=0;i<a1.length;i++){
if (!isElmEquals(a1[i], a2[i]))
return false;
}
return true;
}
function indexOf(value:Array, into:Array):int{
var i:int = -1;
into.some(
function(item:*, index:int, array:Array):Boolean {
if (isArrayEquals(item as Array, value)) {
i = index;
return true;
}
return false;
}
);
return i;
}
var i:int=indexOf([1,1], [[-1,1], [0,1], [1,1], [1,-1]]);
trace(i);
var j:int=indexOf([1,2], [[-1,1], [0,1], [1,1], [1,-1]]);
trace(j);
this works. probably because the inner array is typed.
var qwer:Array = [1,1];
var asdf:Array = [qwer];
trace( asdf.indexOf( qwer ) ); // 0