簡體   English   中英

對關聯數組使用敲除

[英]Using knockout with an associative array

我對使用剔除JS很陌生,因此任何幫助將不勝感激! 所以基本上我有這樣的數據輸入:

    [{ 
   "gjr":{
      "id":"gjr",
      "firstname":"one",
      "companyid":"ff05t5",
      "companyname":"GMC"
   },
   "68g":{
      "id":"68g",
      "firstname":"two",
      "companyid":"ff05t5",
      "companyname":"GMC"
   },
   "ghj":{
      "id":"ghj",
      "firstname":"three",
      "companyid":"a23atr",
      "companyname":"Ford"
   },
   "68f":{
      "id":"68f",
      "firstname":"four",
      "companyid":"ff05t5",
      "companyname":"GMC"
   },
   "f78":{
      "id":"f78",
      "firstname":"five",
      "companyid":"gjd94d",
      "companyname":"Jaguar"
   },
   "fh5":{
      "id":"fh5",
      "firstname":"six",
      "companyid":"gjd94d",
      "companyname":"Jaguar"
   }
}]

而我想做的就是用此數據填充表,以便它看起來像這樣:

ID        FirstName         CompanyID         CompanyName<br/>
gjr       one               ff05t5            GMC<br/>
68g       two               ffo5t5            GMC<br/>
ghj       three             a23atr            Ford<br/>

等等...



我想知道使用淘汰賽js是否可能,還是有更好的方法? 到目前為止,我已經有了一個JSFiddle:

http://jsfiddle.net/GJ7qH/15/

不使用任何工具包/庫/框架,這已經是(應該)很簡單的任務。
首先,請注意JS沒有關聯數組 ,它具有數組(本質上是增強對象)和對象。 您正在處理后者。

這是我的處理方式:

var data = yourData[0],//your data is an array, containing a single object literal
    header = [];
    tbl = {},
    p, p2;
for(p in data)
{
    if (data.hasOwnProperty(p))
    {
        for (p2 in data[p])
        {
            if (data[p].hasOwnProperty(p2))
            {
                if (!tbl.hasOwnProperty(p2))
                {
                    header.push(p2);//add header value
                    tbl[p2] = [];//create array
                }
                tbl[p2].push(data[p][p2]);
            }
        }
    }
}

然后,您將獲得一個header數組,其中列出了所有可用的鍵,並且在tbl對象中,您找到了一個與每個鍵一起的值數組。 編寫一個只打印出您需要打印的內容的循環應該很容易。
另外,您可以使用header數組並“實時”生成輸出行:

var data = yourData[0],//your data is an array, containing a single object literal
    header,//leave undefined
    row = [],
    tbl = [],
    p, i, p2;
for(p in data)
{
    if (data.hasOwnProperty(p))
    {
        if (header === undefined)
        {
            header = [];
            for (p2 in data[p])
                header.push(p2);
            tbl.push(header.join("\t"));
        }
        for (i=0;i<header.length;++i)
            row.push(data[p][header[i]]);
        tbl.push(row.join("\t"));
        row = [];//re-initialize
    }
}
console.log(tbl.join("\n"));//should be pretty accurate

現在,這將適用於我所知道的所有瀏覽器,包括某些人堅持使用的那些老舊的IE。 如果您不太在意這些瀏覽器(無論如何,我也不會),則可以輕松編寫以下代碼:

var data = yourData[0],//your data is an array, containing a single object literal
    header;//leave undefined
    str = '';//output string
    p, i;
for(p in data)
{
    if (header === undefined)
    {//first time over
        header = Object.getOwnPropertyNames(data[p]);
        str = header.join("\t") + "\n";//stringify, tab separated, add new line
    }
    for (i=0;i<header.length;++i)
        str += data[p][header[i]] + "\t";//add value
    str += "\n";
}
console.log(str);//should be close to what you need

免責聲明
我已經把這段代碼寫在腦海中了,沒有一個經過測試,因此您可能還需要進行一些調試工作。 IMO,所有這三個摘要都是不言自明的,但是如果不清楚,可以隨時詢問給定語句的更多詳細信息。

注意:
添加此免責聲明之后,實際上我確實在控制台中測試了我在此處給出的最后一個片段,得到的結果是:

id  firstname   companyid   companyname
gjr one ff05t5  GMC 
68g two ff05t5  GMC 
ghj three   a23atr  Ford    
68f four    ff05t5  GMC 
f78 five    gjd94d  Jaguar  
fh5 six gjd94d  Jaguar

其中,格式化問題似乎是您所追求的

.observableArray方法僅接受null或未定義的數組。

Error: The argument passed when initializing an observable array must be an 
array, or null, or undefined.

您應該處理數據以准備對象數組。

是我更改為您的代碼以使其正常工作的內容。 看看這個!

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM