创建一个具有自定义键的对象数组

6

目前,我有一个对象数组,看起来像这样:

var arr = [{
            id: UNIQUE_ID,
            title: 'TITLE'
          }, {
            id: UNIQUE_ID,
            title: 'TITLE'  
          }];

这里困扰我的是,特定情况下我必须遍历数组并展示匹配ID的数据。我希望只获取那个具有我想要的ID的特定对象的所有内容。如果数组看起来更像这样,对我来说会更容易:

var arr = [{
            id: {
              title: 'TITLE'
            },
            id: {
              title: 'TITLE'
            }
          }]

这个ID是由生成随机数的方法得到的结果,所以我需要为这个ID放置一个变量或者方法调用。

我不确定是否可能实现,因为我没有在这方面找到特别的例子,但我也希望听取其他解决方案。


1
它如何帮助?你再次需要遍历数组中的每个对象。相反,将数组转换为对象(第二个),这样就不需要循环它了。 - Mohit Pandey
你的“外部”容器一定要是一个数组吗?将其设置为对象可以让你只需使用 my_data[key] 来访问对象。你失去了像 push 和 pop 这样的“类似数组”的功能,但如果你不需要它们,就使用对象即可。 - veddermatic
3个回答

19
你可以通过完全删除数组,仅使用对象来实现这一点:
var items = {};
items["some id"] = {title: 'first title'};
items["another id"] = {title: 'second title'};

或者如果您的密钥存储在一个变量中:

var key = "a third id";
items[key] = {title: 'third title'};

稍后,如果您想根据关键字查找其中的一个条目:

var key = "another id";

你可以这样做:

console.log(items[key].title); // "second title" (if key is "another id")

如果您需要知道对象中所有键的名称,可以使用 Object.keys

var arrayOfKeys = Object.keys(obj);

请注意,Object.keys是ES5功能;在旧版浏览器上,您需要为其添加一个微型程序,这很简单。

请注意我在上面的第一个代码块中填充对象的方式。如果您可以硬编码键,则可以使用对象初始化程序:

var items = {
    "some id":    {title: 'first title'},
    "another id": {title: 'second title'}
};

...但是如果您想使用变量作为键名,就不能以这种方式进行操作,因为您无法将变量放在:的左侧(它会被视为字面量键名)。也就是说,如果您有以下代码:

var key = "a third id";

那么这个就不起作用:

var items {
    key: {title: "third title"} // <==== Doesn't do what we want
};

关键是"key",而不是"a third id"(就像我们一直在使用的title键)。这就是为什么在上面的第一个块中,我先创建了对象,然后单独设置属性的原因。

那正是我在寻找的!不过,我不确定我会使用它,因为我必须使用AngularJS,并且需要使用ng-repeat来显示这个数组中的信息,并使用$watch方法来查找该数组中的更改。不幸的是,它们在处理对象时与处理数组时不同。无论如何,还是谢谢,这是我必须应对的另一个问题。 - abpetkov
非常感谢,这就是我所需要的。 - MVDeveloper1

0

你所要求的是索引。你可以通过将数据结构化来轻松实现它:

var arr = {
        1: {
          title: 'TITLE'
        },
        2: {
          title: 'TITLE'
        }
      };

你甚至不需要遍历已经索引化的数组,因为每个条目都可以通过其索引进行访问:

var needle = array[id];

“...现在已经索引的数组…” 那不是一个数组,而是一个非数组对象。 - T.J. Crowder
嗯,严格来说它是一个对象,但由于您可以像访问数组一样访问它(array[key]),所以它的行为非常像一个 :) - Samuel
@ Samy:不,this[that]并不是像数组一样访问它。这是基本的JavaScript 对象属性访问符号,与数组无关,只是数组也使用它。 - T.J. Crowder
@T.J.Crowder:好的,你是老板;)道歉。那点符号表示法呢(object.key)?(我来自Java,所以有些困惑) - Samuel
@ Samy:它们都是对象属性访问器。点符号表示法采用字面名称(obj.foo),括号表示法采用字符串(obj["foo"]),如果不是一个字符串,则强制转换为字符串(即使对于数组也是如此,因为它们实际上不是数组)。 - T.J. Crowder

0

借助UnderscoreJs的帮助:

var arr= [{
    id: '1',
    title: 40
}, {
    id: '2',
    title: 40
}, {
    id: '1',
    title: 60
}];
var res = _.groupBy(arr, function(x){ return x.id; });
res["1"];

结果:

[{
    id: '1',
    title: 40
}, {
    id: '1',
    title: 60
}]

http://jsbin.com/jifabuva/1/edit


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接