查找数组中大于另一个数组中元素的元素

时间:2014-01-16 16:16:23

标签: javascript jquery regex underscore.js

有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)

5 个答案:

答案 0 :(得分:1)

<强> JSFIDDLE DEMO

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]

答案 1 :(得分:1)

首先获取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]

Demo

答案 2 :(得分:1)

假设数组总是按顺序排列:

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

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

答案 3 :(得分:1)

如果两个数组按升序排序,则可以省略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

答案 4 :(得分:-1)

您希望data1中的所有值都大于data2的最大值吗?如果是这样How might I find the largest number contained in a JavaScript array?这可能会有所帮助