Фильтр карты и возврат массива идентификаторов - PullRequest
0 голосов
/ 30 января 2019

У меня есть такая структура:

var entities = {
  1: {'name': 'Fred', 'age': 35},
  2: {'name': 'Hans', 'age': 47},
  3: {'name': 'Bert', 'age': 27}
}

Мне нужно что-то вроде:

var ids = entities.filter( p => p.age > 30);

, который должен возвращать массив:

[1, 2]

Есть ли удобныйспособ сделать это?например, Лодаш и т.д?

Ответы [ 6 ]

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

Вы можете использовать метод lodash reduce.Работает как для массивов, так и для объектов.Пример:

var entities = {
  1: {'name': 'Fred', 'age': 35},
  2: {'name': 'Hans', 'age': 47},
  3: {'name': 'Bert', 'age': 27}
}

var result = _.reduce(entities, (acc, o, key) => {
    if(o.age >= 35) { // add your condition here
       acc.push(key);
     }
    return acc;
}, []);

console.log(result); // ["1", "2"]
0 голосов
/ 30 января 2019

Используйте _.map () и _.keys () для достижения, как показано в коде ниже

var i= -1;
var keys=_.keys(entities);
var person= _.map(entities, function(p) {
    i++;
    if (p.age>30) return keys[i];
});
0 голосов
/ 30 января 2019

filter работает только на Array, но есть кое-что интересное: ваш объект выглядит как массив!

Люди, использующие JavaScript, говорят:

, еслион ходит как утка и крякает как утка, тогда это утка

В этом контексте нечто, действующее как массив, это просто объект с числами в виде ключей плюс a length свойство.И, наблюдая за вашим объектом, вы просто пропускаете свойство длины!

Давайте добавим свойство length следующим образом:

entities.length = Math.max(...Object.keys(entities)) + 1; // 4

Затем вы можете преобразовать свой массивоподобный объект в реальныймассив:

const array = Array.from(entities);

И, наконец, вы можете использовать все свои методы Array, а также фильтр:

array
  .filter(p => p.age > 30)
  .map((obj, index) => index);
0 голосов
/ 30 января 2019

Вы можете циклически проходить по клавишам entities и проверять возрастное состояние для конкретного ключа в entities и фильтровать.

var entities = {
  1: {'name': 'Fred', 'age': 35},
  2: {'name': 'Hans', 'age': 47},
  3: {'name': 'Bert', 'age': 27}
}

let op = Object.keys(entities).filter(e=> entities[e].age > 30)

console.log(op)
0 голосов
/ 30 января 2019

вы можете использовать Object.keys в сочетании с Array.prototype.filter

var entities = {
  1: {'name': 'Fred', 'age': 35},
  2: {'name': 'Hans', 'age': 47},
  3: {'name': 'Bert', 'age': 27}
}
const result = Object.keys(entities).filter(key =>  entities[key].age > 30);
console.log(result);
0 голосов
/ 30 января 2019

Вы можете получить записи, отфильтровать возраст и вернуть ключи (которые, очевидно, являются строками).

var entities = { 1: {'name': 'Fred', 'age': 35 }, 2: {'name': 'Hans', 'age': 47 }, 3: {'name': 'Bert', 'age': 27 } },
    result = Object
        .entries(entities)
        .filter(({ 1: { age } }) => age > 30)
        .map(([k]) => k);

console.log(result);
...