如何从JavaScript对象中获取一个项目?

4

如何从JavaScript对象中获取一个项目:

var items = [
  {
    ITEM:1,
    AMOUNT:10
  },
  {
    ITEM:2,
    AMOUNT:20
  }
];

我希望能够做到以下操作:
$(items).filter(ITEM == 1).AMOUNT;

...将返回10

2个回答

7

您正在创建一个对象数组。如果按顺序插入项目,则可以使用以下方法:

items[0].AMOUNT;   // return the amount of the first item in the array

然而,(使用纯JavaScript)您可能更喜欢利用JavaScript对象的哈希表特性,并使用类似以下内容的代码:

var items = {
    item1: {
       amount: 10
    },
    item2: {
       amount: 20
    }
};

那么您将能够使用下标符号:

items['item1'].amount;

...或者使用点符号表示:

items.item1.amount;

@casablanca的解决方案是一个有效的替代方案,但请注意filter()方法在测试每个数组元素时运行时间复杂度为O(n)。另一方面,从哈希表中查找项的时间复杂度为O(1)(常数时间)。


这接近我想要的,但问题是我不知道项目值会是什么。 - colemande
@colemande:你能举个例子吗?请注意,使用下标符号,您仍然可以执行items['item' + 1].amount;,其中您可以用变量替换1...('item' + 1是字符串连接,并返回'item1')。 - Daniel Vassallo
我可以使用你的第一个答案。但是我需要能够获取我需要的对象的索引。有什么想法吗?变量items = [ { ITEM:红色, AMOUNT:10 }, { ITEM:蓝色, AMOUNT:20 } { ITEM:绿色, AMOUNT:20 }];如何获取items.ITEM == green的索引? - colemande
@colemande:如果你想要能够通过任何属性引用一个项,那么@casablanca的解决方案绝对更容易和更直接。你仍然可以使用我回答中的哈希表解决方案,但你将不得不为每个项的每个属性保留单独的“索引”。如果你有数百项,这可能值得探索,但如果你只有几个项,那么你可能想测试filter解决方案。 - Daniel Vassallo
我选择使用哈希表来解决这个问题。非常感谢你们两位的帮助。 - colemande

4
您可以使用数组filter方法,该方法返回一个包含所有匹配元素的新数组。(可能有多个匹配项)
var results = items.filter(function(obj) { return obj.ITEM == 1; });
for (var i = 0; i < results.length; i++)
  alert(results[i].AMOUNT);

请注意,IE6(我不确定新版本是否支持)不支持filter方法。如果不存在,您可以自己定义它:
if (typeof Array.prototype.filter == 'undefined')
  Array.prototype.filter = function(callback) {
    var result = [];
    for (var i = 0; i < this.length; i++)
      if (callback(this[i]))
        result.push(this[i]);
    return result;
  }

我最终使用了一个哈希表。我是这样做的。$.each(JSONObject, function () { Hashtable[this.item] = this; });现在我可以这样说:HashTable[OBJECT_I_WANT].VALUE_I_WANT_TO_SET = 'N'; - colemande

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