【问题标题】:Unique ID or object signature唯一 ID 或对象签名
【发布时间】:2012-12-18 21:39:49
【问题描述】:

我正在开发一个日志系统,并期待实现 log once 方法。

我遇到的问题是,如何检索唯一标识符和/或对象签名以用作哈希键?

我的想法是:

var Log = {
    messages : {},
    once : function(message)
    {
        // get unique id and/or passed objects signature, use it as a key
        var key = unique( message );

        if ( !Log.messages.hasOwnProperty(key) )
        {
            Log.messages[key] = message;
        }
    }
};

我试过.toString(),但它确实只返回[object Object] 用于基本对象,[object <type>] 用于其他任何东西。没有id,什么都没有。

我也尝试了toSource() 函数,但在 Chrome 中它不想使用基本对象。

不过,我需要的是让它适用于每种类型的对象。无论是字符串、整数、函数,我都需要得到那个签名/id。

也许已经在某个地方实现了这样的功能?

更新

这意味着在循环中进行日志记录,但不是每次迭代都记录,而是只记录一次以防止控制台污染。

我的特定循环实际上是一个游戏循环,我正在调试一些信息。

喜欢:

for (var i = 0; i < 100; i++)
{
    console.log('message');
}
// this would log 100 entries

地点:

for (var i = 0; i < 100; i++)
{
    Log.once('message');
}
// would execute behind the scenes console.log() only once.

【问题讨论】:

  • 只是试图阻止函数多次执行还是我误读了?或者您是否试图阻止某个message 被多次记录?在这种情况下,message 可以是从字符串到对象的任何东西?还是只是一个字符串?
  • 您可以将数字和字符串推送到数组中,但这不适用于 {} !== {}(function foo(){}) !== (function foo(){}) 等对象/函数。
  • 我想你会想看看 [JavaScript Object Id][1]。 [1]:stackoverflow.com/questions/2020670/javascript-object-id
  • 在循环中uniqueId 没有帮助,因为每次我调用Log.once(),它都会创建一个new String 实例,因此,增加id,并且再次登录。

标签: javascript


【解决方案1】:

您可以使用JSON.stringify 获取任意值的“签名”。当然这不会保存对象类型,并且不适用于DateFunction 实例;它也不区分具有相同值的不同对象。如果需要,您需要存储对它们的显式引用(当然会阻碍垃圾收集器释放它们):

var loggedVals = [];
console.once = function() {
    var args = [].slice.call(arguments).filter(function(arg) {
        return (loggedVals.lastIndexOf(arg)==-1) && loggedVals.push(arg);
    });
    if (args.length)
        console.log.apply(console, args);
});

如果您不想存储对它们的引用,则需要通过添加隐藏属性将它们标记为“已记录”(就像 UID 生成器那样):

… function(arg) {
        return !arg.__hasbeenlogged__ && 
          Object.defineProperty(arg, "__hasbeenlogged__", {value: true});
          // configurable, enumarable and writable are implicitly false
    } …

请注意,此解决方案不适用于原始值,甚至对于 nullundefined 都无效 - 您可能需要混合使用这两种方法。

【讨论】:

    猜你喜欢
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 1970-01-01
    • 2011-09-24
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多