簡體   English   中英

在一個數組中查找比另一個數組大的元素

[英]Finding Elements in an Array that are larger than those in another Array

有2個數組data1data2 期望的結果是一個數組,其中包含data1中的所有元素,這些元素大於data2的最大元素[+變量buffer定義的3之前的元素]。 換句話說,結果還應包括data1中匹配元素之前的前3個元素。 這兩個數組已經按升序排序。

我的下面代碼執行了所需的操作,但是有沒有更好的方法來執行相同的操作? 正則表達式會更快嗎?

資料集

data1 = [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110]
data2 = [102, 104, 106, 108]
buffer = 3

期望的結果是[106, 107, 108, 109, 110]

算法

largestData2 = _.max(data2)
data1LargerThanData2 = _.filter(data1, function(data1) {
    return data1 > largestData2
})
smallestData1LargerThanData2 = _.min(data1LargerThanData2)

sliceStart = data1.indexOf(smallestData1LargerThanData2) - buffer
result = data1.slice(sliceStart)

JSFIDDLE演示

var data1 = [100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110],
data2 = [102, 104, 106, 108];
var maxData2 = Math.max.apply(Math, data2);

var newData = [];
data1.map(function(val) {
    if(val > maxData2) {
        newData.push(val);
    }
});
var index = data1.indexOf(newData[0]); //getting index of 1st element

var prev3Arr = [data1[index-3], data1[index-2], data1[index-1]]; //forming prev 3 elements

var finalResult = $.merge( prev3Arr, newData); // merging both arrays

console.log(finalResult);

檢查控制台以獲取結果: [106, 107, 108, 109, 110]

首先獲取data2的最大值:

var max = Math.max.apply(null, data2);

然后從data1中獲取所有大於max

var arr = data1.filter(function (el) {
  return el > max;
});

使用arr中的第一個值的值在data1找到我們的起點,並從中獲取適當的元素塊。

var index = data1.indexOf(arr[0]) - 3;
var chunk = data1.slice(index, index + 3);

arr合並為chunk

chunk.push.apply(chunk, arr); // chunk = [106, 107, 108, 109, 110]

演示

假設數組總是有序的:

var result;
var largestData2 = data2.slice( -1 );

_.each( data1, function( x, index ){
    if( x  > largestData2 ){
        result = data1.slice( index - buffer - 1 );
        return false;
    }
} );

如果兩個數組升序排列,則可以省略max而僅選擇最后一個元素

var largestData2 = data2[data2.length - 1];

要查找data1中大於largest_data2的位置,可以使用二進制搜索,然后返回三個元素

var smallestData1LargerThanData2Index = binarySearch(data1, largestData2);
var sliceStart = smallestData1LargerThanData2Index - buffer;
if (sliceStart < 0)
    sliceStart = 0;

var result = data1.slice(sliceStart);

JSFiddle

更新:

更新了JSFiddle以實際使用underscore.js

您是否希望data1中的所有值都大於data2的最大值? 如果是這樣, 如何找到JavaScript數組中包含的最大數字? 這可能會有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM