Очень простая функция приращения в списке объектов - PullRequest
1 голос
/ 29 марта 2020

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

Возьмите этот рабочий массив в качестве примера:

var numbers = [4,2,6],
    count = 0;

incrementArr();

function incrementArr() {
  if (count < numbers.length) { // if not last array element
    console.log(numbers[count]);
    count++;
  } else {
    console.log(numbers[0]);
    count = 1;
  }
}

Каждый раз, когда вы запускаете incrementArr функция, она просто запишет следующий номер, а затем вернется к началу, если текущее состояние (количество) будет в конце.

Однако я не могу повторить тот же принцип с этим списком объектов:

var objs = {
  first: { // doesn't have to have 'first'
    "number": 4
  },
  second: { // doesn't have to have 'second'
    "number": 2
  },
  third: { // doesn't have to have 'third'
    "number": 6
  }
},
  count = 0;

incrementObj();

function incrementObj() {
  if (count < Object.keys(objs).length) { // if not last obj element
    //objs["first"].number
    console.log(objs[count].number);
    count++;
  } else {
    console.log(objs["first"].number); // what if no "first" in objects?
    count++;
  }
}
  1. Как функция incrementObj могла бы работать так же, как и предыдущая функция incrementArr?

Кажется, я не могу выбрать конкретную c экземпляр объекта (например, numbers [1] из массива выберет 2-е число, но только objs [«second»]. number выберет 2-й объект, который не повторяется, если вы понимаете, что я имею в виду). Как я могу найти обходной путь для типичных обстоятельств, подобных этому?

Итак, в чем разница между:

first: { // doesn't have to have 'first'
  "number": 4
}

и:

{ // doesn't have to have 'first'
  "number": 4
}
Почему у "первых" эт c? (называется ключом?)

Есть ли вообще лучший способ работы со списками объектов (это сложно объяснить)? Спасибо за любой совет здесь.

Ответы [ 3 ]

1 голос
/ 29 марта 2020

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

const keysArr = Object.keys(objs);
function incrementObj() {

  if (count < keysArr.length) { // if not last obj element
    //
    console.log(objs[keysArr[count]].number);
    count++;
  } else {
    console.log(objs["first"].number); // what if no "first" in objects?
    count++;
  }
}
1 голос
/ 30 марта 2020

Я предлагаю использовать итераторы

См. этот кодовый элемент

Если ваш объект имеет определенные c формы, то вы используете это как объектив, чтобы найти number свойство, которое вы хотите. Я не уверен, как вы хотите использовать итератор и вернуть ключ и значение как отдельные свойства, но вы также можете вернуть { [keys[nextIndex]]: values[nextIndex] } или найти другую форму ( мир - ваша устрица ) ).

Если вы дали go эту длину, почему бы не попробовать использовать Rx Js, чтобы сделать ваш объект видимым?

var objs = {
  first: { // doesn't have to have 'first'
    "number": 4
  },
  second: { // doesn't have to have 'second'
    "number": 2
  },
  third: { // doesn't have to have 'third'
    "number": 6
  }
}

function propertyIterator(obj) {
  const keys = Object.keys(obj)
  const values = Object.values(obj)
  const length = keys.length
  let nextIndex = 0

  return {
    next: function() {
      const value = {
        key: keys[nextIndex],
        value: values[nextIndex]
      }
      let done = false

      if (nextIndex >= length) {
        done = true
      }
      nextIndex += 1
      return { current: value, done: done}
    }
  }
}

const incrementObj = propertyIterator(objs)

let result = incrementObj.next()
console.log(result.current.key, result.current.value.number || NaN)
result = incrementObj.next()
console.log(result.current.key, result.current.value.number || NaN)
result = incrementObj.next()
console.log(result.current.key, result.current.value.number || NaN)

с использованием генераторы , см. этот код ручки :

const objs = {
  first: { // doesn't have to have 'first'
    "number": 4
  },
  second: { // doesn't have to have 'second'
    "number": 2
  },
  third: { // doesn't have to have 'third'
    "number": 6
  }
}

const inc = defaultValue => prop => function* (obj) {
  for(let key in obj) {
    yield obj[key][prop] || defaultValue
  }
}

const getNumber = inc(NaN)('number')
const it = getNumber(objs)

let result = it.next()
while (!result.done) {
 console.log(result.value)
 result = it.next()
}

1 голос
/ 29 марта 2020

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

function increment(object) {
    var keys = Object.keys(object),
        index = 0;

    return function() {
        var value = object[keys[index]].number; 
        index++;
        index %= keys.length;
        return value;
    };
}

var objs = { first: { number: 4 }, second: { number: 2 }, third: { number: 6 } },
    incrementObj = increment(objs);

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