Как искать значение в объекте, который также имеет значения в массиве? - PullRequest
0 голосов
/ 07 января 2019

У меня есть объект, как показано ниже;

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

Мне нужно искать значения этого объекта, чтобы сопоставить значения с keys. Есть тонны сэмплов, которые дают keys с единичным значением, но я не смог найти ни одного сэмпла, который также мог бы искать в значениях, которые находятся в массивах.

Как мне найти все эти значения объекта FOO и сопоставить его с keys?

Примечание : цель; Я буду искать ввод, и если задан ввод 2, то ожидать получения ключа BETA или, если задан ввод 4, ZET.

Таким образом, в основном значения будут уже заранее определенными уникальными значениями.

Ответы [ 6 ]

0 голосов
/ 07 января 2019

Вы можете получить ключи, создать массив значений и проверить с помощью 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));
0 голосов
/ 07 января 2019

Вы можете использовать простой цикл 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));
0 голосов
/ 07 января 2019

Попробуйте этот фрагмент,

Я проверяю условия для значений объекта, будь то его массив или значение и применяемое условие в соответствии с этим. Я также сохранил динамический родительский ключ.

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);
0 голосов
/ 07 января 2019

Вы можете просто зациклить объект и найти значение, чтобы определить ключ. Если найдено несколько совпадений, будет возвращен массив ключей, который соответствует результату.

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);
0 голосов
/ 07 января 2019

Вы можете сделать это с помощью простого 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));
0 голосов
/ 07 января 2019

Примерно так должно работать:

// 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...