Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用匿名函数向数组中的JavaScript对象添加值_Javascript - Fatal编程技术网

使用匿名函数向数组中的JavaScript对象添加值

使用匿名函数向数组中的JavaScript对象添加值,javascript,Javascript,我用它来储存图像。我正在尝试使用它们的filepicker.stat()函数获取图像的元数据。但是,虽然它允许我在内部像这样处理元数据: filepicker.stat(InkBlobs[i], { width: true, height: true }, function(metadata){ console.log(JSON.stringify(metadata)) }); 我无法从匿名函数中获取元数据。我想做的是这样的: for(i = 0; i < InkBlobs.length

我用它来储存图像。我正在尝试使用它们的
filepicker.stat()
函数获取图像的元数据。但是,虽然它允许我在内部像这样处理元数据:

filepicker.stat(InkBlobs[i], { width: true, height: true }, function(metadata){ console.log(JSON.stringify(metadata)) });
我无法从匿名函数中获取元数据。我想做的是这样的:

for(i = 0; i < InkBlobs.length; i++)
{
    filepicker.stat(InkBlobs[i], { width: true, height: true }, function(metadata){ InkBlobs[i].add(JSON.stringify(metadata)); });
}
for(i=0;i

这显然不起作用(InkBlobs[i].add(…)
)部分,那么如何捕获该元数据并将其包含在数组中的其他数据中呢?数组内容可以是
JSON.stringify()
'd.

首先,我假设回调接收
元数据作为参数;问题中的代码中缺少了这一点,但我将在下面进行假设

基本上你可以做你写的,你只需要稍微不同地管理
i
,并有一个地方来存储它。由于这是JavaScript,您只需将自己的属性添加到
InkBlob
实例中,但这通常有点危险(以防您与非公共对象发生冲突,或者他们添加了与下一版本中的对象类似的内容,等等)

首先,让我们处理
i

for(i = 0; i < InkBlobs.length; i++)
{
    filepicker.stat(InkBlobs[i], { width: true, height: true }, makeCallback(i));
}
function makeCallback(index) {
    return function(metadata){
        InkBlobs[index].add(JSON.stringify(metadata));
        // This bit ^^ is still theoretical
    };
}
请注意,参数
i
we pass
bind
显示在
stat
提供的任何参数前面(在我的示例中,
bind
的第一个参数
null
是在回调期间设置

从这里开始,我将使用
bind
,因为它更简洁

现在我们必须用InkBlob存储元数据。这里有一个方法:

var data = [];
var count = 0;
for(i = 0; i < InkBlobs.length; i++)
{
    filepicker.stat(InkBlobs[i], { width: true, height: true }, function(index, metadata){
        data[index] = {
            blob:     InkBlobs[index],
            metadata: metadata // No reason to stringify it that I know of, but you could
        };
        ++count;
        if (count === InkBlobs.length) {
            useTheNewArray();
        }
    }.bind(null, i));
}
var数据=[];
var计数=0;
对于(i=0;i

注意,我们等待调用
usetenewarray
,直到看到所有blob的回调。还要注意的是,我们不只是将
推送到新数组,因为它们可能会(理论上)出现故障。当然,如果顺序不重要,
推开
,您就不再需要
计数
变量了。

谢谢您的详细回复!只是想澄清一下,在哪里调用
useTheNewArray()
,你的意思是直接复制上一个InkBlobs数组吗?另外,如果我没有使用
bind()
方法,我是否也必须将元数据传递到
makeCallback()
?出于某种原因,这实际上对我不起作用。我尝试了使用
bind()
和不使用(前一种方法和后一种方法),数据数组保持为空。我想这可能是因为我试图
useNewArray()
,但我不确定除了直接复制或返回数组之外,你还能做些什么。@rar:“使用”是指……使用。索引到其中并使用其中的对象执行操作,而不是使用
InkBlobs
。不,您不必将
元数据
传递到
makeCallback
--
makeCallback
的工作是创建
stat
将使用
元数据
参数调用的函数。啊,好的。我发现它令人困惑,因为直到for循环完成之后,我才真正使用
InkBlobs
数组。我只是想在for循环之外使用元数据之前,通过向每个对象添加元数据来修改每个对象的内容。
var data = [];
var count = 0;
for(i = 0; i < InkBlobs.length; i++)
{
    filepicker.stat(InkBlobs[i], { width: true, height: true }, function(index, metadata){
        data[index] = {
            blob:     InkBlobs[index],
            metadata: metadata // No reason to stringify it that I know of, but you could
        };
        ++count;
        if (count === InkBlobs.length) {
            useTheNewArray();
        }
    }.bind(null, i));
}