如何从具有最小最大值的给定范围数组中获取匹配数组索引

时间:2018-11-01 13:09:33

标签: javascript jquery

如何按预期获得匹配的javascript数组索引?
范围最小值-第一个值 最大范围-给定数组的最后一个值

var arr = [{
    range:[0,20],
    title:"First"
    data:["a","b"]
},
{
    range:[20,40],
    title:"Second"
    data:["d","f"]
},
{
    range:[40,60],
    title:"THird"
    data:["g","k"]
}];


function getRange( value ){
    // retun index of the array
}

getRange( 22 ) -> Expect to get 1 as the array index
getRange( 50 ) -> Expect to get 2 as the array index

8 个答案:

答案 0 :(得分:1)

使用Array.findIndex

CKEDITOR.on("instanceCreated", function (ev) {
    "use strict";
    ev.editor.on("widgetDefinition", function (evt) {
        var widgetData = evt.data;

        if (widgetData.name !== "image" || widgetData.dialog !== "image2") return;

        //Override of upcast
        if (!widgetData.stdUpcast) {
                widgetData.stdUpcast = widgetData.upcast;

                widgetData.upcast = function (el, data) {
                    el = widgetData.stdUpcast(el, data);

                    if (!el) return el;

                    if (el.name === "img") {
                        el.addClass('img-fluid img-responsive');                                    
                    }

                    return el;
                };
        }

        //Override of downcast
        if (!widgetData.stdDowncast) {
            widgetData.stdDowncast = widgetData.downcast;

            widgetData.downcast = function (el) {

                el = this.stdDowncast(el);

                if (el && el.name === "img") {
                    el.addClass('img-fluid img-responsive');                                    
                }

                return el;
            }
        }
    });
});

注意:由于函数计算的范围包括低值和高值(包括),如果边界值为(20、40等)< / strong>,将返回首个匹配项的索引。例如如果为40,则返回的索引将为1。

答案 1 :(得分:1)

1)请注意,有几个逗号分隔数据中的属性。

2)您需要更新范围模式(0-20、21-40等),以确保以后不会遇到问题。

3)您可以使用findIndex返回值在范围内的 first 对象的索引。

var arr = [{"range":[0,20],"title":"First","data":["a","b"]},{"range":[21,40],"title":"Second","data":["d","f"]},{"range":[41,60],"title":"THird","data":["g","k"]}];

function getRange(arr, value){

  // for each object in the array get the range property
  return arr.findIndex(({ range }) => {
  
    // and return the first index where the value
    // fits within the range
    return value >= range[0] && value <= range[1];
  });
}

console.log(getRange(arr, 22));
console.log(getRange(arr, 50));

答案 2 :(得分:0)

您必须遍历所有数组项,以便比较该值在数组值范围内是否可用。您可以通过JS中的“ for”循环来做到这一点。

下面是代码示例,请尝试一下:

var arr = [{
    range:[0,20],
    title:"First"
    data:["a","b"]
},
{
    range:[20,40],
    title:"Second"
    data:["d","f"]
},
{
    range:[40,60],
    title:"THird"
    data:["g","k"]
}];


function getRange( value ){
    // retun index of the array
 for(var i=0; i<arr.length; i++){
   if(value > arr[i][0] && value <= arr[i][1]){
      return arr[i];
   } else{
    return null;
   }
 }
}

注意:在这里,如果值是“ 20”,则它将返回第一个数组项。只是因为我们在if条件中比较“ <=”。在您的情况下,它不会选择第二个数组项。

答案 3 :(得分:0)

遍历数组,并检查每个范围内的值是否在范围内的值之间。

该值可能在两个不同索引的范围内。因此它将保留一个数组并将所有索引推入其中

var arr = [{
    range: [0, 20],
    title: "First",
    data: ["a", "b"]
  },
  {
    range: [20, 40],
    title: "Second",
    data: ["d", "f"]
  },
  {
    range: [40, 60],
    title: "THird",
    data: ["g", "k"]
  }
];


function getRange(value) {
  let inxArray = [];
  arr.forEach(function(item, index) {
    if (value >= item.range[0] && value <= item.range[1]) {
      inxArray.push(index)
    }


  });
  return inxArray
}

console.log(getRange(22)[0])
console.log(getRange(50)[0])

答案 4 :(得分:0)

您可以使用Array.findIndex()方法:

var arr = [{
    range:[0,20],
    title:"First",
    data:["a","b"]
},
{
    range:[20,40],
    title:"Second",
    data:["d","f"]
},
{
    range:[40,60],
    title:"THird",
    data:["g","k"]
}];


function getRange( value ){
   var index = arr.findIndex(obj => obj.range[0] < value && value < obj.range[1]);
   return index;
}

console.log(getRange( 22 ));
console.log(getRange( 50 ));

答案 5 :(得分:0)

如果您使用的是es6

function getRange( value ){
  return arr.findIndex(item=>{
    if(value>item.range[0] && value<=item.range[1]){
      return true;
    }
  });
}

如果您不使用es6

function getRange( value ){
  var flag = -1; 
  arr.map((item, i)=>{
    if(value>item.range[0] && value<=item.range[1]){
      flag = i;
    }
  });
  return flag;
}

答案 6 :(得分:0)

var arr = [{
    range:[0,20],
    title:"First",
    data:["a","b"]
},
{
    range:[20,40],
    title:"Second",
    data:["d","f"]
},
{
    range:[40,60],
    title:"THird",
    data:["g","k"]
}];


function getRange( value ){
    arr.map(a=>
    console.log((a.range[0]<=value && a.range[1]>=value)? arr.indexOf(a):'')
    );
}

getRange( 22 )// Expect to get 1 as the array index
getRange( 50 ) // Expect to get 2 as the array index

遍历数组并检查range数组之间的范围,然后返回索引。

答案 7 :(得分:0)

如果我理解正确,您希望getRange(value)返回该项目的索引,其中item.range[0] < value && item.range[1] > value

由于对象的结构方式,代码中没有任何内容可以防止2个项目具有重叠范围。在这种情况下,您是否要返回第一个匹配项,最后一个匹配项或其他结果?例如,如果在此示例中调用getRange(20),您会期望什么。

此外,您的示例在“标题”属性后还缺少一些逗号。

忽略所有这些,您可以使用Array.reduce()作为一个简洁的解决方案。

function getRange(value) {
    return arr.reduce(function(result, item, i) {
        if (result === null) {
            result = item.range[0] <= value && item.range[1] > value ? i : result;
        }
        return result;
    }, null);
}