Как получить первые n элементов объекта с помощью lodash?

Я хочу, чтобы получить первые N пар ключ/значение из объект (не массив) с помощью lodash. Я нашел этот ответ для подчеркивания, в котором говорится использовать use первый (не существует в lodash), или использовать забрать (работает только на массивах).

пример сеанса узла, пытающегося получить пары "a:7" и "b:8" из объекта:

> var ld=require("lodash")
undefined
> var o={a:7, b:8, c:9}
undefined
> ld.keys(o)
[ 'a', 'b', 'c' ]
> ld.take(o, 2)
[]
> ld.first(o, 2)
undefined
> 

конечно, должен быть какой-то простой способ сделать это с лодашь, но для жизни меня Я ничего не могу найти. Может быть, мне придется прибегнуть к родному js?

2 ответов


вы не можете взять первые n элементов объекта без написания кода. Это потому, что есть нет упорядочения элементов в объектах, поэтому, если бы для него была библиотечная функция, она никогда не гарантировала бы вам элементы, которые вы ожидаете. Учитывая объект, как

var obj = {  b: 3, y: 2, a: 1 };

неясно, что означает "первые 2" - вы хотите a и b потому что это алфавитный порядок? Если да, то в таком порядке или нет? Если нет, вы хотите b и y потому что они появляются первыми? Возможно, вы хотите a и y из-за того, что их значения самые низкие?

нет никакой гарантии того, что вы получите Помимо не получения дубликатов, поэтому все эти комбинации действительны. Кроме того, вы можете получить их в любом порядке y и a является одинаково допустимым выходом, Вы можете предпочесть тот или иной, но это не делает его правильным в целом.

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

чистое решение JavaScript.

function firstN(obj, n) {
  return Object.keys(obj) //get the keys out
    .sort() //this will ensure consistent ordering of what you will get back. If you want something in non-aphabetical order, you will need to supply a custom sorting function
    .slice(0, n) //get the first N
    .reduce(function(memo, current) { //generate a new object out of them
      memo[current] = obj[current]
      return memo;
    }, {})
}
var obj = { b: 2, y: 25, a: 1 }

console.log( firstN(obj, 2) );

это с помощью , массив.прототип.вроде и массив.прототип.уменьшить

то же самое может быть достигнуто с lodash, но не намного более кратким, чем это - это будет включать вызов подобной функциональности. Это можно сделать так, ибо пример:

function firstN(obj, n) {
  return _.chain(obj)
    .keys()
    .sort()
    .take(n)
    .reduce(function(memo, current) {
      memo[current] = obj[current];
      return memo;
    }, {})
    .value();
}

var obj = { b: 2, y: 25, a: 1 }
      
console.log( firstN(obj, 2) );
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

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


если вы посмотрите документацию loadash для first. Он только принимает массив в качестве аргумента, и это, вероятно, не использовать API.

см.:https://lodash.com/docs/3.10.1#first


Вот 1 метод, который вы можете решить, используя standard Javascript API-интерфейс.

здесь загвоздка в том, что вы можете использовать Object.keys(...)[index] API для извлечения ключа элемента на основе их позиции.

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

var firstN = 2;
var o={a:7, b:8, c:9};
var result = {};

for (var index=0; index < firstN; index++) {
  var key = Object.keys(o)[index];
  result[key] = o[key];
}

console.log(result);