2

我从事 PHP 工作多年,在为整数 ID 的对象在 JS 中创建一些更复杂的数据结构时遇到了麻烦。我需要构建一个对象来存储这些更简单的对象,这些对象以它们的整数 id 分层键控。因此,如果我有以下对象,每个对象都有一个唯一的整数 id:

部分,元素,项目,条目

在php中我会做类似的事情

$arr[$section_id][$element_id][$item_id][$entry_id] = $entry;

在 javascript 中,这不起作用。我知道我可以在技术上将这些 ID 用引号括起来以强制使用它,但这似乎是个坏主意。类似地,我可以创建一个对象并使用带引号的整数方法,但这又看起来很老套。

现在我将数据存储在常规整数索引数组中,然后使用 caolan 的异步检测通过 ID 查找特定成员。这可行,但与 php 等效项相比似乎非常混乱。我希望在 JS 中有一种更清洁的方法来做到这一点。

蒂亚!

4

2 回答 2

0

由于 javascript 无法保存带有字符串索引的数组,我使用这些:

var namespace = function(name, separator, container){
  var ns = name.split(separator || '.')
    , o = container || window
    , i = 0;
  while (i++ < ns.length) o = o[ns[i - 1]] = o[ns[i - 1]] || {};
  return o;
}

namespace(arr + '.' + section_id + '.' + element_id + '.' + item_id + '.' + entry_id) = entry;
// ex : namespace('arr.1.3.2.6') will product arr.1.3.2.6 object
于 2013-02-19T03:20:58.323 回答
0

这有点难看,但它会让你非常接近你想要的。

您可以向 JavaScript Array 类添加一个方法,如下所示:

Array.prototype.g = function(index) { 
    if (this[index] == undefined) { 
         this[index] = [];
    } 
    return this[index]; 
 }

然后,要设置一些东西,你会这样做:

var test = [];
test.g(5).g(7)[5] = 1;

不幸的是,对于最后一个条目,您必须记住使用常规符号来设置值。

你会像你期望的那样检索它:

test[5][7][5]; //1

显然我只是凭空抽出 g ,你可以想出你自己的函数名。

免责声明:人们倾向于不赞成使用原型链扩展内置类型,但据我所知,大多数主要框架不再这样做,除非您或某些第三方 JS 使用相同的名称在其他地方扩展 Array,您应该没事的。

于 2013-02-19T03:38:48.207 回答