Как получить значения массива и ключи объекта совпадают независимо от порядка - PullRequest
0 голосов
/ 27 января 2019

В массиве значений

var legends =['some','key', 'value'];

график с соответствующими значениями obj;

var graph = {
  orgid: ['123', '123556', '456', '345', '2345'],
  some: [1500, 1500, 1500, 1500, 1500],
  key: [900, 900, 900, 900, 900],
  value: [1072, 1373, 946, 715, 276]
 };

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

Я выполнил код, но он работает только в том случае, если порядок клавиш одинаков в порядке, указанном в obj

es5 way

var grphFilter = [];
var countRaw = 0; 
for (var key in graph) {
  if (key === legends[count] ) {
    grphFilter.push(graph[key]);
    count++;
  }
}

es6 way

let grphFilter = [];
let count = 0; 
const result = Object.entries(graph).forEach(function([key, value]) {
  if (key === legends[count]) {
    grphFilter.push(value);
    count++
  }
})

, но это не будет работать для клавиш, которые не в порядке, как.

var legendsNotOrder =['key', 'some', 'value'];

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

Конечный результат

var graphfiltered = [
  [1500, 1500, 1500, 1500, 1500],
  [900, 900, 900, 900, 900],
  [1072, 1373, 946, 715, 276]
];

Ответы [ 5 ]

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

ES6 Одноконтурное решение с reduce, которое игнорирует неизвестные ключи в массиве legends:

const legends = ['some', 'key', 'value', 'random_key'];

const graph = {
    orgid: ['123', '123556', '456', '345', '2345'],
    some:  [1500, 1500, 1500, 1500, 1500],
    key:   [900, 900, 900, 900, 900],
    value: [1072, 1373, 946, 715, 276]
};

const result = legends.reduce((a, c) => {
    if (r = graph[c]) {
        a.push(r);
    }
    return a;
}, []);

console.log(result);

Как правило, map + filter часто можно заменить на reduce.Дело в том, что код может стать более сложным.Преимуществом, вероятно, будет оптимизация (возможно, «микро»), которая часто не стоит этого.

Обратите внимание, я заменил var на const в вашем исходном коде.

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

Использовать записи Object #, Array # Reduce, Array # include, Array # push

const legends=['some','key','value'];const graph={orgid:['123','123556','456','345','2345'],some:[1500,1500,1500,1500,1500],key:[900,900,900,900,900],value:[1072,1373,946,715,276]}

const res = Object.entries(graph)
.reduce((a,[k,v])=>{
  if(legends.includes(k)) a.push(v);
  return a;
}, []);

console.log(res);
0 голосов
/ 27 января 2019

Вы можете зациклить массив с помощью keys, а затем напрямую получить доступ к объекту graph.Кроме того, вы можете проверить, является ли ключ valid перед выполнением push для нового массива:

var legends = ['some', 'key', 'value', 'notkey'];

var graph = {
    orgid: ['123', '123556', '456', '345', '2345'],
    some: [1500, 1500, 1500, 1500, 1500],
    key: [900, 900, 900, 900, 900],
    value: [1072, 1373, 946, 715, 276]
 };
 
 let graphFilter = [];
 legends.forEach(x => graph[x] && graphFilter.push(graph[x]));
 console.log(graphFilter);

Другой альтернативой является объединение filter () и map () в записях графа.

var legends = ['some', 'key', 'value', 'notkey'];

var graph = {
    orgid: ['123', '123556', '456', '345', '2345'],
    some: [1500, 1500, 1500, 1500, 1500],
    key: [900, 900, 900, 900, 900],
    value: [1072, 1373, 946, 715, 276]
 };
 
let graphFilter = Object.entries(graph)
     .filter(([k, v]) => legends.includes(k))
     .map(([k, v]) => v);

console.log(graphFilter);
0 голосов
/ 27 января 2019

Проблема в том, что вы проверяете key на текущей итерации с определенным значением в массиве legends.Вам нужно проверить, равно ли key на текущей итерации какому-либо из значений этого массива.

Что-то вроде:

legends.includes(key)

Вот полный пример:

var legends = ['some', 'key', 'value'];

var graph = {
  orgid: ['123', '123556', '456', '345', '2345'],
  some: [1500, 1500, 1500, 1500, 1500],
  key: [900, 900, 900, 900, 900],
  value: [1072, 1373, 946, 715, 276]
};

var graphFilter = [];
for (var key in graph) {
  if (legends.includes(key)) {
    graphFilter[legends.indexOf(key)] = graph[key];
  }
}

console.log(graphFilter);
0 голосов
/ 27 января 2019

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

var legends =['some','key', 'value'];

var graph = {orgid: ['123', '123556', '456', '345', '2345'],some: [1500, 1500, 1500, 1500, 1500],key: [900, 900, 900, 900, 900],value: [1072, 1373, 946, 715, 276]};
 
let filteredGraph = legends.map( cur => graph[cur])

console.log(filteredGraph)


//In case you have keys in legend which are not available in graph you can use below code

let filteredGraph = legends.filter( cur => graph[cur])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...