使用具有关联数组的knockout

时间:2014-01-23 11:01:43

标签: javascript knockout.js multidimensional-array 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/

2 个答案:

答案 0 :(得分:3)

不使用任何类型的任何工具包/ lib /框架,这已经(应该)是一项非常简单的任务 首先,请注意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数组并生成输出行“real-time”

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  

其中,格式化协助似乎就是你所追求的

答案 1 :(得分:1)

.observableArray方法只接受数组,null或undefined。

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

您应该处理数据以准备一系列对象。

Here是我更改为您的代码以使其正常工作的原因。看看吧!

希望它有所帮助。