从数组中删除元素,直到只有10个元素

时间:2014-01-21 18:58:32

标签: javascript arrays

我在Javascript中有一个对象数组,如下所示:

[{width:100,height:50,name:"John"},{width:27,height:12,name:"John"},..]

如果数组大小大于10,我想删除那些区域(宽度*高度)较小的对象。因此,如果有20个对象,则删除其中10个区域较小的区域。

我怎么能这样做?

现在我所做的是有一个阈值来过滤对象。所以我这样做:

var i = elements.length;
var threshold = 100;
while (i--) {
  if (elements[i].width * elements[i].height < threshold) {
    elements.splice(i,1);
  }
}

但这不是我想要的。我不想要一个静态阈值,我只想删除哪个区域小于其余前10位。

3 个答案:

答案 0 :(得分:10)

您可以先按区域对阵列进行排序,然后使用slice只留下10个更大的阵列。像这样:

var arr = arr.sort(function(a, b) {
    var as = a.width * a.height,
        bs = b.width * b.height;
    if (as > bs) return -1;
    if (as < bs) return 1;
    return 0; 
})
.slice(0, 10);

演示:http://jsfiddle.net/y765Z/

答案 1 :(得分:3)

您可以对数组进行排序,然后将其长度设置为10.

var areas = [{width:100,height:50,name:"John"},{width:27,height:12,name:"John"},...];

areas.sort(function(a, b){ 
    return  b.height * b.width - a.height * a.width;
});

areas.length = 10;

请注意,这只有在您不关心是否重新排序数组元素时才有效。

http://jsfiddle.net/g9Hk7/

答案 2 :(得分:1)

另一种可能性,如果你需要保持它们的顺序,这有点奇怪:

arr.map(function(item, index) {
    return {index: index, area: item.height * item.width};
}).sort(function(a, b) {
    return b.area - a.area;
}).slice(10).sort(function(a, b) {
    return b.index - a.index;
}).reduce(function(arr, item) {
    arr.splice(item.index, 1);
    return arr;
}, arr);

这会修改原始数组,但您可以通过用

替换最后一行来更改它
}, clone(arr));

使用一些适当的克隆功能,也许这个:

var clone = function(obj) {return JSON.parse(JSON.stringify(obj));};

显然,如果你想把它变成一个函数,你可以推广10,并且很容易从area抽象到对象的任意函数中。