синтаксис для JS функции стрелки как метод объекта - PullRequest
0 голосов
/ 26 марта 2020

Первый раз здесь.

Я нашел эту полезную функцию @CertainPerformance для рекурсивного поиска вложенных элементов по идентификатору.

const findItemNested = (arr, itemId, nestingKey) => (
  arr.reduce((a, item) => { 
    if (a) return a;
    if (item.id === itemId) return item;
    if (item[nestingKey]) return findItemNested(item[nestingKey], itemId, nestingKey)
  }, null)
);

Я не могу понять синтаксис для создания этого Функционирование метода в объекте util. Следующий синтаксис не работает:

var util = {
const findItemNested = (arr, itemId, nestingKey) => (
  arr.reduce((a, item) => { 
    if (a) return a;
    if (item.id === itemId) return item;
    if (item[nestingKey]) return findItemNested(item[nestingKey], itemId, nestingKey)
  }, null)
);
}

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

var util = {
findItemNested: function (arr, itemId, nestingKey) => (
  arr.reduce((a, item) => { 
    if (a) return a;
    if (item.id === itemId) return item;
    if (item[nestingKey]) return findItemNested(item[nestingKey], itemId, nestingKey)
  }, null)
);
}

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

var util = {
findItemNested: function (arr, itemId, nestingKey) => {
  arr.reduce((a, item) => { 
    if (a) return a;
    if (item.id === itemId) return item;
    if (item[nestingKey]) return findItemNested(item[nestingKey], itemId, nestingKey)
  }, null)
}
}

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

Единственный способ, которым я могу это сделать заставить эту функцию работать, чтобы она была установлена ​​как глобально доступная функция с исходным синтаксисом из @CertainPerformance в моем скрипте. js file.

Есть ли способ добавить эту функцию в мой var util ? Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 26 марта 2020

Я бы не использовал здесь синтаксис функции стрелки, но больше синтаксис метода :

const util = {
  findItemNested(arr, itemId, nestingKey) {
    return arr.reduce((a, item) => { 
      if (a) return a;
      if (item.id === itemId) return item;
      if (item[nestingKey]) return util.findItemNested(item[nestingKey], itemId, nestingKey)
    }, null)
  );
}
0 голосов
/ 26 марта 2020

Привет, спасибо за ответы и предложения.

Я снова попытался реализовать код следующим образом, используя ключевое слово function, чтобы он был методом для моего var util следующим образом:

var util = {

  findItemNested: function (arr, itemId, nestingKey) {
    arr.reduce((a, item) => {
      if (a) return a;
      if (item.id === itemId) return item;
      if (item[nestingKey]) return this.findItemNested(item[nestingKey], itemId, nestingKey)
    }, null)
  },
}

И, как предлагал Берджи выше, я превратил рекурсивный вызов в вызов метода с помощью:

this.findItemNested(…)

К сожалению, метод все еще возвращает undefined при структурировании таким образом. Версия автономной глобальной функции, первоначально опубликованная в ответе @CertainPerformance на другой вопрос stackoverflow, - единственный способ заставить ее работать. Любые другие идеи о том, что я могу делать здесь не так? Еще раз спасибо.

0 голосов
/ 26 марта 2020

Вы используете функцию стрелки es6 вместе с ключевым словом function. Если вы хотите, чтобы это работало внутри объекта, лучше всего сохранить код таким же, но удалить стрелку. Ваша вторая строка должна выглядеть так:

findItemNested: function (arr, itemId, nestingKey){
...