我有以下数组:
var data = [{
length: 900,
fields: 3
},{
length: 1150,
fields: 4
},{
length: 1700,
fields: 5
}];
现在,我想拥有一个根据给定长度返回字段的函数,例如:
function getFields(length) {
// return "3" if length <= 900
// return "4" if length <= 1150
// return "5" if length <= 1700
}
我该如何实现?
答案 0 :(得分:2)
只要数据正确排序,它就很容易进行循环
var data = [{
length: 900,
fields: 3
},{
length: 1150,
fields: 4
},{
length: 1700,
fields: 5
}];
function getFields (value) {
var i;
for (i=0; i<data.length; i++) {
if (value <= data[i].length) return data[i].fields; // exit since we found first match
}
return 0; // what ever the default is for no match
}
console.log(800, getFields(800));
console.log(900, getFields(900));
console.log(1000, getFields(1000));
console.log(1500, getFields(1500));
console.log(2000, getFields(2000));
或使用现代数组方法,您可以使用find(),类似于上面的for循环代码:
var data = [{
length: 900,
fields: 3
},{
length: 1150,
fields: 4
},{
length: 1700,
fields: 5
}];
function getFields (value) {
var i;
var match = data.find(function(item) {
return value <= item.length
})
return match ? match.fields : 0;
}
console.log(800, getFields(800));
console.log(900, getFields(900));
console.log(1000, getFields(1000));
console.log(1500, getFields(1500));
console.log(2000, getFields(2000));
现在,如果数据数组混乱,则应该对其进行排序。
答案 1 :(得分:1)
您可以迭代data
并匹配条件
var data = [{
length: 900,
fields: 3
},{
length: 1150,
fields: 4
},{
length: 1700,
fields: 5
}];
function getFields(len) {
var fields = '';
$.each(data, function(key,value) {
if(value.length<=len)
fields = value.fields;
});
return fields;
}
// call function
alert(getFields(1700));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
答案 2 :(得分:1)
您不需要jQuery
,可以用例如标准的.find()
通话。请注意,这假设您的示例中数据是按.length
排序的。
var data = [{
length: 900,
fields: 3
}, {
length: 1150,
fields: 4
}, {
length: 1700,
fields: 5
}];
var value = 950;
var matching = data.find(x => value <= x.length);
var fields = matching ? matching.fields : 0;
console.log(fields);
答案 3 :(得分:1)
我会这样定义它:
function getFields(length) {
var d = data
.filter(d => d.length <= length) // get the list of matching objects
.sort((a, b) => b.length - a.length) // sort descending so largest value is at the front of the array
.shift(); // get the first element from the array
return (d !== undefined) ? d.fields : undefined;// if that element exists, return .fields, otherwise undefined
}
实际情况:
var data = [{
length: 900,
fields: 3
},{
length: 1150,
fields: 4
},{
length: 1700,
fields: 5
}];
function getFields(length) {
var d = data
.filter(d => d.length <= length) // get the list of matching objects
.sort((a, b) => b.length - a.length) // sort descending so largest value is at the front of the array
.shift(); // get the first element from the array
return (d !== undefined) ? d.fields : undefined;// if that element exists, return .fields, otherwise undefined
}
var tests = [1700, 1150, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700];
console.log(tests.map(getFields));
虽然我不知道这对于您当前的用例而言是否足够有效,但是它相对可读且易于遵循(尽管如果始终按length
对数据进行排序,这样做可能会更加高效。 , 例如)。如果您需要性能更高的产品,可以改成这样:
function getFields(length) {
let d;
let i = data.length - 1;
while (i > -1 && d === undefined) {
if (data[i].length <= length) {
d = data[i].fields;
}
i -= 1;
}
return d;
}
实际中:
var data = [{
length: 900,
fields: 3
},{
length: 1150,
fields: 4
},{
length: 1700,
fields: 5
}];
function getFields(length) {
let d;
let i = data.length - 1;
while (i > -1 && d === undefined) {
if (data[i].length <= length) {
d = data[i].fields;
}
i -= 1;
}
return d;
}
var tests = [1700, 1150, 900, 1000, 1100, 1200, 1300, 1400, 1500, 1600, 1700];
console.log(tests.map(getFields));