Самый эффективный способ вернуть вложенный массив, содержащий строку (JavaScript) - PullRequest
0 голосов
/ 24 января 2020

Я хотел бы знать, существует ли более эффективный метод доступа к вложенному массиву на основе сопоставленного значения вместо использования forEach или a для l oop.

. У меня на данный момент:

var a = [
  ["aaa", "111", "!!!"],
  ["bbb", "222", "@@@"],
  ["ccc", "333", "###"],
  ["ddd", "444", "$$$"]
];

var b = "222";

var c;

a.forEach((aa) => {
	if (aa.includes(b)) c = aa;
});

// Ideally c would return ["bbb", "222", "@@@"]

console.log(c);

Спасибо

1 Ответ

1 голос
/ 24 января 2020

Я предполагаю, что вы хотите найти первый массив с вашей иглой:

var a = [
  ["aaa", "111", "!!!"],
  ["bbb", "222", "@@@"],
  ["ccc", "333", "###"],
  ["ddd", "444", "$$$"]
];



function search(haystack, needle) {
  return haystack.find( item => item.includes(needle) );
}

console.log(search(a,'222'));

Если ваши данные имеют статус c, вы можете создать кеш и использовать стрелку для получения массива.

var a = [
  ["aaa", "111", "!!!"],
  ["bbb", "222", "@@@"],
  ["ccc", "333", "###"],
  ["ddd", "444", "$$$"]
];

const cache = a.reduce(
  (out, row) => {
    for (const item of row) out[item] = row;
    return out;
  },
  Object.create(null)
);


console.log(cache['222']);

Современная версия ES2019 с использованием flatMap и Map:

const a = [
  ["aaa", "111", "!!!"],
  ["bbb", "222", "@@@"],
  ["ccc", "333", "###"],
  ["ddd", "444", "$$$"]
];

const m = new Map(a.flatMap(r=>r.map(i=>[i,r])));

console.log(m.get('222'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...