2015-04-15 103 views
1

我正在使用Google工作表和脚本编写从表中查找数据并将记录作为哈希值返回的函数。这样做可能有更好的方法,但现在,我试图返回一个记录散列数组,其中的键是字段名称。JavaScript中的哈希阵列

我遇到的麻烦是从数组中的单个记录哈希中调用一个键。它只是返回'未定义'。下面是我的测试代码的部分,我写一下我的应用程序代码,在那里我遇到的问题:

function hashArrayTest() { 
    var workbookKey = "I blanked this out" 
    var tableName = "AttributeChildParentJoin"; 
    var headerRow = 1; 
    var i; 
    var attrsJoinObj = new dbEntitySource(workbookKey, tableName, headerRow); 
    var OutputHashArray = attrsJoinObj.returnHashItems("Parent Attribute", "Child Attribute", "AESTHETICS"); 

    Logger.log("This is the resulting output array of hashes: "); 

    for(i=0; i<OutputHashArray.length; i++){ 
    Logger.log("-------------" + i + "-------------"); 
    Logger.log(OutputHashArray[i]); 
    } 

    Logger.log("Here are the Parent Attributes from each hash: "); 

    for(i=0; i<OutputHashArray.length; i++){ 
    Logger.log("-------------" + i + "-------------"); 
    Logger.log(OutputHashArray[i]['Parent Attribute']); 
    } 
    } 

这里的源数据表:

An image of the data table source


这里是代码输出的日志:

[ - ]这是生成的哈希输出数组:
[ - ] ------------- 0 ---------- ---
[ - ] {'添加日期'='','小孩属性'='颜色','父属性'='AESTHETICS','添加'='','ID'='21'}
[ - ] ------------- 1 -------------
[']添加日期'='','子属性'='完成','父属性'='AESTHETICS','新增' ='','ID'='22'}
[ - ] ------------- 2 -------------
[ - ] { '添加'='','子属性'='材料','父属性'='AESTHETICS','添加'='','ID'='23'}
[ - ] --- ---------- 3 -------------
[ - ] {'添加日期'='','儿童属性'='VBL造型坚持','父属性'='AESTHETICS','添加'='','ID'='24'}
[ - ]以下是父项属性每个哈希:
[ - ] ------------- 0 -------------
[ - ] undefined
[ - ] ---- --------- 1 -------------
[ - ] undefined
[ - ] ------------- 2-- -----------
[ - ] undefined
[ - ] ------------- 3 -------------
在这个输出中,虽然我无法从e中调用['Parent Attribute']键,但看起来好像我成功地创建了一个哈希数组。 ach hash。

我写了一个非常简单的函数来测试我的问题与散列数组,但这次我成功了。 =>
下面的代码:

function rawHashTest(){ 
var recordHash1 = {}; 
recordHash1['car'] = 45; 
recordHash1['chicken'] = "ten"; 

var recordHash2 = {}; 
recordHash2['red'] = 30; 
recordHash2['sticks'] = "blue"; 

Logger.log(recordHash1); 
Logger.log(recordHash1['car']); 

var hashArray = new Array(); 
hashArray = [recordHash1, recordHash2]; 

Logger.log(hashArray); 
Logger.log(hashArray[0]); 
Logger.log(hashArray[0]["car"]); 
} 

这里的日志:

[ - ] {鸡=十位,车= 45.0}
[ - ] 45.0
[ - ] [{鸡=十,车= 45.0},{红= 30.0,棍=蓝}
[ - ] {鸡=十,车= 45.0}
[ - ] 45。0

我不明白为什么我能够从我的简单测试代码中的数组中的一个哈希值中调用哈希键值,但不是在测试我的应用程序代码时。我已经尝试了所有不同的方式,并且检查了前导和尾随空格。我在这里错过了什么?

谢谢 尼古拉斯·金凯德

+1

Logger.log(typeof OutputHashArray [0])是什么日志? 你也可以'通过OutputHashArray [i] for-in? – cssimsek

回答

0

谢谢大家对这个问题的探针。我检查了我的returnHashItems方法,发现问题。

我的dbEntitySource.returnHashItems方法使用另一种方法来构建每个单独的散列。下面是一个包括原线和更新的行的代码:

this.returnHash = function returnHash(recordIndex){ 
    var recordHash = {}; 

    if (recordIndex !== -1){ 
     for (i=0; i<this.headerArray.length;i++){ 

     // This is the line that was giving me the issue: 
     //recordHash["'"+ this.headerArray[i] +"'"] = "'" + this.dataArray[recordIndex][i] + "'";   

     // This is the line that fixed the problem: 
     recordHash[this.headerArray[i]] = this.dataArray[recordIndex][i]; 
    } 
    } 
    return recordHash; 
} 

它回过头来看,它看起来像我原本以为我不得不放在引号,因为这是它是如何做直接指定字符串如:

var recordHash1 = {}; 
recordHash1['car'] = 45; 
recordHash1['chicken'] = "ten"; 

但是,因为在headerArray和dataArray中的值已经字符串,这是多余的,也造成了一个问题。什么类型的问题,我不确定。

谢谢cssimsek的调试提示。

function hashArrayTest() { 

    var workbookKey = "1uOHlrW8pSACDg9dNUzMFKgLi8fDBT4Wsqc5KadkoCXk"; 
    var tableName = "AttributeChildParentJoin"; 
    var headerRow = 1; 
    var i; 
    var attrsJoinObj = new dbEntitySource(workbookKey, tableName, headerRow); 
    var OutputHashArray = attrsJoinObj.returnHashItems("Parent Attribute", "Child Attribute", "AESTHETICS"); 

    Logger.log("Here is the data type for the OutputHashArray:"); 
    Logger.log(typeof OutputHashArray); 

    Logger.log("Here is the data type for the OutputHashArray[0]:"); 
    Logger.log(typeof OutputHashArray[0]); 

    Logger.log("This is the resulting output array of hashes: "); 

    for(i=0; i<OutputHashArray.length; i++){ 
    Logger.log("-------------" + i + "-------------"); 
    Logger.log(OutputHashArray[i]); 
    } 

    Logger.log("Here are the Parent Attributes from each hash: "); 

    for(i=0; i<OutputHashArray.length; i++){ 
    Logger.log("-------------" + i + "-------------"); 
    Logger.log(OutputHashArray[i]['Parent Attribute']); 
    } 
} 



输出修复之前::I [0]之前和之后的修复检查OutputHashArray的类型

[ - ]下面是OutputHashArray的数据类型:
[ - ]对象
[ - ]下面是数据类型的OutputHashArray [0]:
[ - ]对象
[ - ]这是散列产生的输出数组:
[ - ] ------------- 0 -------------
[ - ] {'Date Added '='','Child Attribute'='Color','Parent Attribute'='AESTHETICS','Added'='','ID'='21'}
[ - ] ------ ------- 1 -------------
[']添加日期'='','子属性'='完成','父属性'=' AESTHETICS','加'='','ID'='22'}
[ - ] ------------- 2 ------------ -
{'添加日期'='','儿童属性'='材料','父属性'='AESTHETICS','加'='','ID'='23'}
[ - ] ------------- 3 -------------
[ - ] {'添加日期'='','儿童属性'='VBL样式坚持','父属性'='AESTHETICS','添加'='','ID'='24'}
[ - ]以下是每个散列的父属性:
[ - ] ------------- 0 -------------
[ - ] undefined
[ - ] ------------- 1 -------------
[ - ] undefined
[ - ] ------ ------- 2 -------------
[ - ] undefined
[ - ] ------------- 3 ---- ---------
[ - ] undefined

01修复后



输出:

[ - ]下面是OutputHashArray数据类型:
[ - ]对象
[ - ]下面是OutputHashArray数据类型[0 ]:
[ - ]对象
[ - ]这是散列结果输出数组:
[ - ] ------------- 0 --------- ----
[ - ] {添加日期=,儿童A ttribute = Color,ID = 21.0,Parent Attribute = AESTHETICS,添加者=}
[ - ] ------------- 1 -------------
[ - ] {添加日期=,子属性=完成,ID = 22.0,父属性=美学,添加=}
[ - ] ------------- 2 ---- ---------
[ - ] {添加日期=,儿童属性=材料,ID = 23.0,父项属性= AESTHETICS,增加=}
[ - ] -------- ----- 3 -------------
[ - ] {Date Added =,Child Attribute = VBL Styling Adherence,ID = 24。0,Parent Attribute = AESTHETICS,添加=}
[ - ]以下是每个散列的父属性:
[ - ] ------------- 0 ------ -------
[ - ]美学
[ - ] ------------- 1 -------------
[ - ] AESTHETICS
[ - ] ------------- 2 -------------
[ - ] AESTHETICS
[ - ] ------ ------- 3 -------------
[ - ] AESTHETICS

看起来问题不在于我的hashArray的数据类型,而在于我如何指定散列键。感谢大家的调试技巧,它真的帮了大忙!