1

背景

我有一个类型相同的对象数组。

我创建了一个类来处理所有相同类型的数组的查找。该类的重点是防止每次根据其属性查找对象时对数组的迭代次数超过您需要的次数。

我的查找类的骨架看起来像这样。所以你可以理解它的作用。

/**
 * @constructor
 * @param {Array} items An array of all the same type of item.
 */
titan.structs.IndexedLookup = function (items) {};

/**
 * Get by property
 * @param {String} property The property name.
 * @param {String|Number} value The property value.
 * @returns {Object|null}
 */
titan.structs.IndexedLookup.prototype.getByProperty = 
function (property, value) {};

问题

我想用这个的最后一行

var lookup = new titan.structs.IndexedLookup(myArrayOfItems);
// Lookup by property 'id'
var item = lookup.getByProperty("id", 27);

我想不出任何巧妙的方法来获取高级编译器分配的实际属性名称而不是“id”。

评论

我不是在寻找在对象类型的引号中使用属性的解决方案,因为在设计对象类时需要先验知识,以便稍后在某些未知组件中将其用作查找属性。

4

2 回答 2

2

这是一个棘手的问题,并且没有很好的解决方案。您可以查看一些讨论:使用重命名测试属性存在

通常我会找到重构代码以不同方式处理问题的方法。

我鼓励您在 Closure-compiler 项目中打开一个问题,请求支持此功能的功能。

于 2013-08-09T14:51:24.630 回答
2

有多种解决方案:

防止重命名的两种方法:

  • 一致地使用属性引用:

    item['id'] = 2;
    lookup.getByProperty('id', 2);
    
  • 添加一个外部声明:

    Object.prototype.id;
    

允许重命名的两种方法:

  • 为 JSCompiler_renameProperty 添加声明,例如:

    function JSCompiler_renameProperty(prop) { return prop }
    

并像这样使用它:

lookup.getByProperty(JSCompiler_renameProperty("id"), 27);

这不好在基于类型的优化中效果很好。

  • 使用闭包库中的 goog.reflect.object:

    var idPropName = (goog.object.transpose(goog.reflect.object(MyType, id: 1)))[1];
    

这允许您指定与属性关联的类型,并且可以很好地与基于类型的优化配合使用。

于 2013-08-12T00:26:43.960 回答