用JavaScript压缩数组

时间:2011-05-30 23:20:23

标签: javascript ruby arrays node.js

什么是JavaScript相当于Ruby的Array#compact?

长版....我跟着blog.nemikor.com的例子。他的最后一个例子关闭了旧的请求,但随后pendings继续充满了过时的请求。这看起来像是一个记忆泄漏给我。

我的解决方案是使用pendingsfilter进行迭代,如下所示,但似乎pendings.pushpendings = pendings.filter之间可能存在竞争条件。我是偏执狂吗?如果存在竞争条件,我该如何解决?

var pendings = [];

// there is a route
app.get('/some/path', function (request, response) {
  pendings.push({
    response: response,
    requestedAt: new Date().getTime()
  });
});

setInterval(function () {
  var expiration = new Date().getTime() - (1000 * 30);
  pendings = pendings.filter(function (pending, index) {
    if (pending.requestedAt > expiration) {
      return true;
    } else {
      pending.response.writeHead(408, { 'Content-Type': 'text/plain' });
      pending.response.end('');
    }
  });
}, 1000);

4 个答案:

答案 0 :(得分:3)

JavaScript中没有线程,因此没有竞争条件。所有代码都按顺序排列,只有在完成运行后才会进行控制。因此,在任何其他函数触及pendings之前,您的间隔函数将一直运行到完成。

适用于setTimeoutsetInterval等内容。

作为实验:如果您使用setTimeout在1秒后触发超时。之后你写了一个阻塞2秒的while循环,你的超时会在之后触发,超过1秒。

原始的东西:

var timer = setTimeout(function () {
    alert("hi!");
}, 1000);
var now = new Date();
var till = new Date(now + 2);
while(new Date() < till) {}   // block for 2 seconds

答案 1 :(得分:2)

您可能需要查看Underscore.js库 http://documentcloud.github.com/underscore/

这提供了许多有用的低级函数来处理集合,数组和对象。它包括compact函数(虽然我认为它与您正在查找的内容有不同的用途)和filter函数。

答案 2 :(得分:1)

只要您没有进行I / O操作,即您只进行内存操作,就可以保证不会中断(由于事件循环的性质)。

这样,小心,如果你的集合太长(就像上千个或更多),因为你可以阻止事件循环一段时间,而不是让其他请求得到服务。

答案 3 :(得分:0)

一个旧的线程,但它应该得到原始问题的答案:

什么是与Ruby的Array#compact等效的JavaScript?

list1 = [null, 'no', 'nulls', null]

// With plain JS
jsFilter = list1.filter(function (obj) { return obj })

// With ES6
let filtered = list1.filter((obj) => obj)

//> (2) ["no", "nulls"]

console.log(es6Filter)

但是有一个警告,因为:

filter()为数组中的每个元素调用提供的回调函数一次,并构造所有值的新数组 为此,回调返回强制为true的值

falsey = [false, 0, 0n, '', NaN, null, undefined]
truthy = [true, 1, ' ']

list2 = ['returns', 'only', 'truthy', 'values'].concat(truthy).concat(falsey)

let filtered = list2.filter((obj) => obj)

//> (7) ["returns", "only", "truthy", "values", true, 1, " "]

console.log(filtered)

要使其像Ruby的紧凑版一样正常工作,您可以执行以下操作:

falsey = [false, 0, 0n, '', NaN, null, undefined]
truthy = [true, 1, ' ']
list3 = ['works', 'like', "Ruby's", 'compact'].concat(truthy).concat(falsey)

let them_go = [null, undefined] // Just a fun with variable names
let filtered = list3.filter((obj) => { return !them_go.includes(obj) })

//> (12) ["works", "like", "Ruby's", "compact", true, 1, " ", false, 0, 0n, "", NaN]

console.log(filtered)

如果您要从数组中删除所有空元素(空字符串,数组和对象),可以在此处查看我的答案-> https://stackoverflow.com/a/59905255/3251051

参考: