【问题标题】:Find a value in a multidimensional array if I know another?如果我知道另一个值,请在多维数组中查找一个值?
【发布时间】:2016-08-15 20:55:35
【问题描述】:

我有一个多维数组并使用 jQuery。我知道 shortname,如何获取 conversionSI 并将结果放入变量、console.log 或其他内容中?或者我的数组可以看起来更好(因为我希望它尽可能快)。

我的数组

var UnitArray = [ {
 name : "liter",
 shortName : "l",
 unitType : "volym",
 country : "sv",
 conversionSI : 1
 }, {
 name : "deciliter",
 shortName : "dl",
 unitType : "volym",
 country : "sv",
 conversionSI : 0.1
 }, {
 name : "centiliter",
 shortName : "cl",
 unitType : "volym",
 country : "sv",
 conversionSI : 0.01
 }];

例如,我知道短名称“cl”和“dl”,并想在计算中使用它们的转换SI。

【问题讨论】:

  • 这不是一个多维数组——它只是一个对象数组。
  • UnitArray.filter(o=>o.shortName==='cl'||o.shortName==='dl').map(o=>o.conversionSI)

标签: javascript jquery arrays multidimensional-array


【解决方案1】:

你可以创建这样的函数DEMO

var getConversion = function(el) {
  for (var i = 0; i < UnitArray.length; i++) {
    var obj = UnitArray[i];
    if (obj.shortName == el) return obj.conversionSI;
  }
}

console.log(getConversion('cl'));

更新了返回数组的函数Demo

【讨论】:

    【解决方案2】:

    如果发现短路的解决方案

    function getValue(array, shortName, property) {
        var r;
        array.some(function (a) {
            if (a.shortName === shortName) {
                r = a[property];
                return true;
            }
        });
        return r;
    }
    
    var UnitArray = [{ name: "liter", shortName: "l", unitType: "volym", country: "sv", conversionSI: 1 }, { name: "deciliter", shortName: "dl", unitType: "volym", country: "sv", conversionSI: 0.1 }, { name: "centiliter", shortName: "cl", unitType: "volym", country: "sv", conversionSI: 0.01 }];
    
    document.write(getValue(UnitArray, 'cl', 'conversionSI') + '<br>');
    document.write(getValue(UnitArray, 'dl', 'conversionSI') + '<br>');

    【讨论】:

      【解决方案3】:

      您可以在这种情况下使用.find()

      console.log(UnitArray.find(v => v.shortName == "cl").conversionSI); // 0.01
      

      你可以把它做成一个函数,这样会很方便,

      var getConversionSI = 
           shortName => UnitArray.find(v => v.shortName == shortName ).conversionSI
      console.log(getConversionSI("cl")); // 0.01
      

      【讨论】:

      • 请注意,这仅适用于支持 ES6 的浏览器。
      【解决方案4】:

      这是一个通用函数,它将根据提供的要过滤的属性/值获取任何属性的值。

      function getVal(arr, filterProp, filterVal, prop) {
        return arr.filter(function (el) {
          return el[filterProp] === filterVal;
        }).map(function (el) {
          el[prop];
        });
      }
      
      getVal(UnitArray, 'shortName', 'cl', 'conversionSI') // [ 0.01, 0.01 ]
      

      DEMO

      【讨论】:

        【解决方案5】:

        我们可以创建一个函数,该函数将根据所需的属性和值返回项目的索引。请注意,它只会返回第一个实例。 reduce 方法是 ES5,所以现在普遍支持。

        var UnitArray = [ {
          name : "liter",
          shortName : "l",
          unitType : "volym",
          country : "sv",
          conversionSI : 1
        }, {
          name : "deciliter",
          shortName : "dl",
          unitType : "volym",
          country : "sv",
          conversionSI : 0.1
        }, {
          name : "centiliter",
          shortName : "cl",
          unitType : "volym",
          country : "sv",
          conversionSI : 0.01
        }];
        
        function findIndexByProp(prop, value, arr) {
          return arr.reduce(function(a, c, i) {
            if (a !== -1) return a;
        
            return (c[prop] === value) ? i : a;
          }, -1);
        }
        
        var index = findIndexByProp('shortName', 'dl', UnitArray);
        
        var conversionSI = UnitArray[index].conversionSI;
        

        【讨论】:

          【解决方案6】:

          我猜你有一个短名称数组,并且想要得到一个对应值的数组(在你的情况下是conversionSI)。你可以看看:

          var UnitArray = []; // here your array is
          var shortnames = ["cl", "dl"];
          var conversionSIs = UnitArray
              .reduce(function (foundValues, unitElem) {
                  if (~shortnames.indexOf(unitElem.shortName)) {
                    foundValues.push(unitElem.conversionSI);
                  }
                  return foundValues;
              }, []);
          
          console.log('conversionSIs', conversionSIs);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-04-22
            • 2020-05-29
            • 2015-10-05
            相关资源
            最近更新 更多