【问题标题】:Javascript process keys in Array of objects对象数组中的 Javascript 进程键
【发布时间】:2014-10-21 20:27:23
【问题描述】:

我正在使用这个library 来跟踪我的网络摄像头流式传输的视频中的一些颜色。

返回被跟踪对象的代码很简单:

tracker.on('track', function(event) {
        
        console.log(event.data)

                  });

event.data 是一个对象数组,每个对象包含 5 个键 'color' , 'x' , 'y' , 'height' , 'width',我要做的是找到 2 个它们的“X”相差 10 的对象,即 x1-x2=10x2-x1=10 (我们称它们为相邻对象),已知event.data 随实时跟踪而变化,这不是静态数组。

尝试使用 jQuery .grep(),但无法弄清楚如何处理多个项目。

【问题讨论】:

  • 取决于您需要多快的答案。如果不是等到视频结束,你就不需要这么快处理了。
  • 创建一个函数,将 x 作为参数并返回所有已保存的事件,其中 x 相差 +-10,因为可能不止一个。
  • @ArtOfCode 这是一个直播,只要它在运行,我必须处理所有对象。

标签: javascript jquery arrays javascript-objects


【解决方案1】:

您只需要遍历数组并比较这些值:

for var i = 0; i < event.data.length; i++ )
{
    var data1 = event.data[ i ];

    //Now we'll loop through the whole array to compare
    for ( var x = 0; x < event.data.length; x++ )
    {
        if ( Math.abs( data1.x - event.data[ x ].x ) === 10 )
        {
            return { x1: data1, x2: event.data[ x ] };
        }
    }
}

【讨论】:

  • 请再次阅读我的问题,我需要找到所有相邻的对象。
【解决方案2】:

我会这样做(Array.prototype.filter$.grep() 做同样的事情):

var events = [];
tracker.on('track', function(e){
    events.push(e.data);
});

function getEventsByXDiff(x){
    return events.filter(function(e){
        return e.x - x === 10 || x - e.x === 10
    });
}

// Usage: getEventsByXDiff(someEvent.x);

虚拟事件数据示例:http://jsfiddle.net/11mvLtqp/

【讨论】:

  • 感谢您的回答,我不明白您的逻辑,但您能解释一下为什么这不起作用吗? jsfiddle.net/11mvLtqp/2
  • @ProllyGeek 它按预期工作。 15 是 5 +- 10 的唯一匹配项。
  • 但我需要两个与进程匹配的对象,即 5 和 10
  • @ProllyGeek 5 和 10 的差异为 5 而不是您在问题中要求的 10。您是否要求 x +- 10 加上事件本身的所有匹配事件?
  • Johan 假设我们有一个数组 [10 , 55, 30 , 5 , 12] ,我需要找到 diff == 5 的两个元素,这将输出 10 & 5 它们满足条件。
【解决方案3】:

我建议创建另一个容器数组来包含(真的吗?)跟踪器生成的所有数组:

var container = [];
tracker.on("track", function(event) {
    var newIndex = container.length;
    container[newIndex] = event.data;
    process(newIndex);
});

现在您已经保存了所有数据,您可以对其进行处理:

function process(index) {
    var adjacent = [];
    for(var i = 0; i < container.length; i++) {
        var subtract = container[index].x - container[i].x;
        if(subtract == 10 || subtract == -10)
          adjacent.push(i);
    }
    return adjacent;
}

所以现在,如果 process() 返回 true,你就知道差是 10。你现在用它做什么取决于你。

【讨论】:

  • 或者干脆return Math.abs(subtract) === 10;
  • 是的。我这样做是因为它更容易一目了然。
  • 另外,第一次触发事件时,您将调用process 并尝试获取container[-1]...
  • 请注意,数组在每一帧都会更新,我需要找到所有相邻的对象,您的解决方案将只处理连续的项目。
  • “相邻”?你是什​​么意思,@ProllyGeek?
猜你喜欢
  • 1970-01-01
  • 2016-12-23
  • 2021-10-30
  • 2016-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
相关资源
最近更新 更多