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

How to search a value in Object which has values in array as well?

我有一个对象如下;

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

我需要搜索此对象的值以匹配 keys 的值。有大量样本给出了 keys 的奇异值,但我找不到任何样本也能够搜索数组中的值。

我怎样才能搜索 FOO 对象的所有这些值并与 keys 匹配?

:目的;我将寻找一个输入,如果给定的输入是 2 那么期望得到密钥 BETA 或者如果给定的输入是 4 那么 ZET.

所以基本上这些值已经是一些预定义的唯一值了。

像这样的东西应该可以工作:

// 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);

您可以使用简单的 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));

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

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

试试这个片段,

我正在检查对象值的条件,无论是它的数组还是值以及应用条件。我也保持父键动态。

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

您可以使用简单的 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));

您可以获取键,创建值数组并检查 includes。 Return 找到的密钥。

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