代码之家  ›  专栏  ›  技术社区  ›  Nuri Engin

如何在数组中也有值的对象中搜索值?

  •  1
  • Nuri Engin  · 技术社区  · 6 年前

    我有一个物体如下;

    FOO: {
            BAR: [9,32,8,12 ],
            ZET: 4,
            BETA: [3,14,6,2],
            ALPHA: 37
        },
    

    我需要搜索此对象的值以匹配 keys . 有好几吨的样品 钥匙 有一个奇异值,但我找不到任何样本也能在数组中的值中搜索。

    我怎样才能搜索 FOO 对象并与匹配 钥匙 ?

    注释 :目标;我将查找输入,如果给定的输入是 2 然后期望得到钥匙 BETA 或者如果给定的输入是 4 然后 ZET .

    所以基本上,这些值将是一些预先定义的唯一值。

    6 回复  |  直到 6 年前
        1
  •  4
  •   Mohammad Usman    6 年前

    你可以用一个简单的 for...in 循环和 .concAT() .includes() 数组方法:

    let obj = {
      BAR: [9,32,8,12 ],
      ZET: 4,
      BETA: [3,14,6,2],
      ALPHA: 37
    };
    
    let locator = (o, v) => {
      for (var prop in o) {
        if([].concat(o[prop]).includes(v)){
          return prop;
        }
      }
    }
    
    console.log(locator(obj, 2));
    console.log(locator(obj, 4));
        2
  •  7
  •   Nina Scholz    6 年前

    您可以获取键,创建一个值数组,然后使用 includes . 返回找到的密钥。

    function find(object, value) {
        return Object
            .keys(object)
            .find(k => [].concat(object[k]).includes(value));
    }
    
    var object = { FOO: { BAR: [9, 32, 8, 12], ZET: 4, BETA: [3, 14, 6, 2], ALPHA: 37 } };
    
    console.log(find(object.FOO, 4));
    console.log(find(object.FOO, 8));
        3
  •  1
  •   Vivek    6 年前

    您可以简单地循环对象并搜索值来标识键。如果找到多个匹配项,将返回与结果匹配的键数组。

    function objSearch(key, obj) {
      const keys = [];
      for (let item in obj) {
        if (obj.hasOwnProperty(item)) {
          if (obj[item] === key || (Array.isArray(obj[item]) && obj[item].indexOf(key) > -1)) {
            keys.push(item);
          }
        }
      }
      return keys;
    }
    
    const obj = {
      FOO: {
        BAR: [9, 32, 8, 12],
        ZET: 4,
        BETA: [3, 14, 6, 2],
        ALPHA: 37
      }
    };
    
    const res1 = objSearch(14, obj.FOO); // Exist
    const res2 = objSearch(15, obj.FOO); // Does not exist
    const res3 = objSearch(37, obj.FOO); // Exist
    
    console.log(res1);
    console.log(res2);
    console.log(res3);
        4
  •  1
  •   Rahul    6 年前

    试试这个片段,

    我正在检查对象值的条件,不管是其数组还是值,并根据该条件应用条件。我也保持了父键的动态性。

    var abc = {
      FOO: {
        BAR: [9, 32, 8, 12],
        ZET: 4,
        BETA: [3, 14, 6, 2],
        ALPHA: 37
      },
      DAB: {
        DBAR: [9, 32, 8, 12],
        DZET: 4,
        DBETA: [3, 14, 6, 2],
        DALPHA: 37
      },
    };
    
    function retTitle(abc, parent, k) {
      var title = '';
      $.each(abc[parent], function(x, y) {
        if ((Array.isArray(y) && y.indexOf(k) != -1) || (!Array.isArray(y) && y == k)) {
          title = x;
          return;
        }
      });
      return title;
    }
    var title = retTitle(abc, 'DAB', 4);
    console.log(title);
        5
  •  1
  •   Terry Lennox    6 年前

    这样的方法应该有效:

    // What we're searching
    FOO = {
            BAR: [9,32,8,12 ],
            ZET: 4,
            BETA: [3,14,6,2],
            ALPHA: 37
        };
    
    
    function findValue(findValue, obj) {
        return Object.entries(FOO)
        .filter(([key,value]) => value === findValue || Array.isArray(value) && value.includes(findValue))
        .map(([key,value])=> key);
    }
    
    function testfindValue(value, obj) {
        console.log("testfindValue: \nInput: " + value, "Result: ", findValue(value,obj));
    }
    
    testfindValue(4, FOO);
    testfindValue(6, FOO);
    testfindValue(32, FOO);
    testfindValue(99, FOO);
        6
  •  1
  •   Dmitry Joshua Enos    6 年前

    你可以用一个简单的 for...in 循环迭代键。然后检查该值是否是一个数字,是否等于您要查找的值。如果它不是一个数字,那么它是一个数组-因此您检查这个数组是否包括您要查找的数字。

    var FOO = {
            BAR: [9,32,8,12 ],
            ZET: 4,
            BETA: [3,14,6,2],
            ALPHA: 37
        };
    
    function findKeyByValue(obj, val) {
      for (var i in FOO) {
        if (!obj.hasOwnProperty(i)) continue;
        if (typeof FOO[i] === 'number') {
          if(FOO[i] === val) return i;
        } else {
          if(FOO[i].includes(val)) return i;
        }
      }
    }
    
    console.log(findKeyByValue(FOO, 4));