Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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 从数组中删除元素,直到只有10个元素_Javascript_Arrays - Fatal编程技术网

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

Javascript 从数组中删除元素,直到只有10个元素,javascript,arrays,Javascript,Arrays,我有一个Javascript对象数组,如下所示: [{width:100,height:50,name:"John"},{width:27,height:12,name:"John"},..] 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)

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

[{width:100,height:50,name:"John"},{width:27,height:12,name:"John"},..]
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);
如果数组大小大于10,我想删除那些面积(宽度*高度)较小的对象。因此,如果有20个对象,请删除其余对象中面积较小的10个对象

我怎么能这样做

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

var i = elements.length;
var threshold = 100;
while (i--) {
  if (elements[i].width * elements[i].height < threshold) {
    elements.splice(i,1);
  }
}
var i=elements.length;
var阈值=100;
而(我--){
if(元素[i]。宽度*元素[i]。高度<阈值){
元件.拼接(i,1);
}
}

但这不是我想要的。我不想要一个静态阈值,我只想删除那些面积小于前10名的数组。

您可以先按面积对数组进行排序,然后使用
切片
只留下10个较大的数组。大概是这样的:

[{width:100,height:50,name:"John"},{width:27,height:12,name:"John"},..]
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);
var arr=arr.sort(函数(a,b){
var as=a.宽度*a.高度,
bs=b.宽度*b.高度;
如果(as>bs)返回-1;
如果(as

演示:您可以对数组进行排序,然后将其长度设置为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;
注意,只有在不关心数组元素是否被重新排序的情况下,这才有效


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

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
推广,并且很容易从
区域
抽象成对象上的任意函数。

@Zzyrk用我所拥有的编辑。只需
返回为-bs
@dfsq我觉得你的答案很棒,我投了更高的票,但我发现Dagg Nabbit更容易理解。谢谢你们花时间回答。你们说得对,伙计们@DaggNabbit您的版本肯定更简洁。@HommerSmith当然,我也发现Dagg Nabbit的答案更清楚。@HommerSmith:请注意,如果数组长度小于10项,则分配
.length
将无法正常工作
slice
是一种更简洁的方法。按照dfsq的回答,使用areas.length或splice有什么区别?@HommerSmith,没什么,我只是觉得设置长度更简单、更清晰、更简洁。@dfsq我实际上在你的文章发表之前就开始写了,并考虑不发表它,但我决定保留它,因为排序函数更简单。我认为人们有时忘记了排序回调只需要返回正或负,而不是+1或-1。