如何按预期获得匹配的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
答案 0 :(得分:1)
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);
}