Попытка найти несколько объектов из массива, когда дано несколько ключей в массиве - PullRequest
0 голосов
/ 15 октября 2019

Я собираюсь получить массив текстовых строк меток, соответствующих значениям в массиве. Массив объектов является статическим, но массив текстовых строк будет динамическим от пользовательского ввода. Я хочу знать, как лучше всего настроить es6 с помощью фильтра или карты.

Вот статический массив объектов:

const counts = [
    {label: '0-0', value: 1},
    {label: '0-1', value: 2},
    {label: '0-2', value: 3},
    {label: '1-0', value: 4},
    {label: '1-1', value: 5},
    {label: '1-2', value: 6},
    {label: '2-0', value: 7},
    {label: '2-1', value: 8},
    {label: '2-2', value: 9},
    {label: '3-0', value: 10},
    {label: '3-1', value: 11},
    {label: '3-2', value: 12},
];

Это пример массива ключей Iя получу:

Array [
  "0-2",
  "1-2",
  "2-0",
  "3-1"
]

Итак, результаты, которые я хочу получить, это массив со значениями:

[3,6,7,11]

У меня есть способы сделать это небрежно, проверяя каждое значение по одному,Я просто не уверен, что использовать, например, фильтр, карту, уменьшить или найти.

Ответы [ 3 ]

1 голос
/ 15 октября 2019

Для этого мы можем использовать функцию фильтра и карты JS.

let test = [
  "0-2",
  "1-2",
  "2-0",
  "3-1"
];
let counts = [{
    label: '0-0',
    value: 1
  },
  {
    label: '0-1',
    value: 2
  },
  {
    label: '0-2',
    value: 3
  },
  {
    label: '1-0',
    value: 4
  },
  {
    label: '1-1',
    value: 5
  },
  {
    label: '1-2',
    value: 6
  },
  {
    label: '2-0',
    value: 7
  },
  {
    label: '2-1',
    value: 8
  },
  {
    label: '2-2',
    value: 9
  },
  {
    label: '3-0',
    value: 10
  },
  {
    label: '3-1',
    value: 11
  },
  {
    label: '3-2',
    value: 12
  },
];


let answer = counts.filter(item => (
  test.includes(item.label)
)).map(item => item.value)
console.log(answer);
0 голосов
/ 15 октября 2019

Вы можете создать Map, который будет действовать как справочная таблица (lut) для меток и связанных с ними значений. Используя Map, вы можете .map() ваш массив меток стать значением из объекта Map.

Используя этот подход, вам нужно будет только один раз просмотреть массив counts один рази ваш массив меток (arr) один раз, что позволит вам избежать « проверки каждого значения по одному », предоставляя вам сложность ~ O (n + k), а не O(нк):

const counts = [{label:"0-0",value:1},{label:"0-1",value:2},{label:"0-2",value:3},{label:"1-0",value:4},{label:"1-1",value:5},{label:"1-2",value:6},{label:"2-0",value:7},{label:"2-1",value:8},{label:"2-2",value:9},{label:"3-0",value:10},{label:"3-1",value:11},{label:"3-2",value:12}];
const arr = ["0-2", "1-2", "2-0", "3-1"];

const lut = new Map(counts.map(({label, value}) => [label, value]));
const res = arr.map(label => lut.get(label));
console.log(res);
0 голосов
/ 15 октября 2019

Вы можете использовать array#reduce и добавить значение совпадающей метки, используя array#find.

const counts = [{ label: '0-0', value: 1 }, { label: '0-1', value: 2 }, { label: '0-2', value: 3 }, { label: '1-0', value: 4 }, { label: '1-1', value: 5 }, { label: '1-2', value: 6 }, { label: '2-0', value: 7 }, { label: '2-1', value: 8 }, { label: '2-2', value: 9 }, { label: '3-0', value: 10 }, { label: '3-1', value: 11 }, { label: '3-2', value: 12 }, ],
      input = [ "0-2", "1-2", "2-0", "3-1" ],
      output = input.reduce((arr, label) => {
        const matched = counts.find(o => o.label === label);
        if(matched) arr.push(matched.value);
        return arr;
      },[]);
console.log(output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...