从JavaScript中的多维数组获取数据

时间:2018-08-14 13:12:03

标签: javascript arrays

我有以下数组:

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
}

我该如何实现?

4 个答案:

答案 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));