Как вернуть элемент из массива вместо индекса

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

это массив

var items = ['bill','hill','dill',4,5,6,7,8,9,10];

это моя функция

function getItem(index, arr) {
    if (index > arr.length) {
        return -1; 
    }

    const prev = index - 1;
    const next = index + 1;
    const prevPrev = prev - 1;
    const nextNext = next + 1;

    if (index == 0) { 
        return {index, next, nextNext}
    } else if (index == arr.length - 1) { 
        return {prevPrev, prev, index}
    } else {
        return {prev, index, next};
    }
}

выход

{prev: 1, index: 2, next: 3}

я хочу вернуться

{prev:'bill', index:'hill', next:'dill'}

Как вы вызываете функцию getItem

brk 07.02.2019 17:15

console.info(getItem(2, элементы));

Filip neskoski 07.02.2019 17:18

Сокращения свойств объекта ES6 не подходят для вашего случая. Вы должны явно определить значение для каждого ключа в возвращаемом объекте, например: {index: arr[index], next: arr[next], nextNext: arr[nextNext]}

hindmost 07.02.2019 17:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
486
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вы можете сделать это следующим образом:

var items = ['bill', 'hill', 'dill', 4, 5, 6, 7, 8, 9, 10];

function getItem(index, arr) {
  if (index > arr.length) {
    return -1;
  }

  const prev = items[index - 1];
  const next = items[index + 1];
  const prevPrev = items[prev - 1];
  const nextNext = items[next + 1];
  const index1 = items[index]

  if (index == 0) {
    return {
      index1,
      next,
      nextNext
    }
  } else if (index == arr.length - 1) {
    return {
      prevPrev,
      prev,
      index1
    }
  } else {
    return {
      prev,
      index1,
      next
    };
  }
}

console.info(getItem(1, items));

Вы возвращаете значение каждого индекса в массиве, а не номер индекса сам по себе.

Спасибо за ответ. Есть только 1 проблема, если у меня есть этот массив var items = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; и когда я console.info(getItem(1, items)); мой вывод предыдущий: 1, индекс: 1, следующий: 3

Filip neskoski 07.02.2019 17:30

Предполагая, что ваши входные данные для вашей функции являются числом для «индекса» и массивом для вашего «арра», возврат arr[number] должен возвращать нужные вам элементы.

то есть

if (index > arr.length) {
    return -1; 
}
    const prev = index - 1;
    const next = index + 1;
    const prevPrev = prev - 1;
    const nextNext = next + 1;

    if (index == 0) { 
        return {arr[index], arr[next], arr[nextNext]}
    } else if (index == arr.length - 1) { 
        return {arr[prevPrev], arr[prev], arr[index]}
    } else {
        return {arr[prev], arr[index], arr[next]};
    }
}

Хотя вы должны обезопасить себя от того, что ваши возвращаемые значения выходят за пределы (т.е. проверка того, что nextNext и prevPrev все еще находятся в пределах размера массива - например, массив только из 2)

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

    if (index == 0) { 
        return {arr[index], arr[next], arr[nextNext]}

...и так далее и тому подобное.

Ответ принят как подходящий

Вы должны сделать небольшое изменение внутри функции проверьте эти строки

const prev = index - 1;
const next = index + 1;
return { prev, index: index, next };

Просто измените их на

const prev = arr[index - 1];
const next = arr[index + 1];
return { prev, index: arr[index], next };

поэтому он возвращает значение вместо индекса

var items = ['bill','hill','dill',4,5,6,7,8,9,10];

function getItem(index, arr) {
    if (index > arr.length) {
        return -1; 
    }

    const prev = arr[index - 1];
    const next = arr[index + 1];
    const prevPrev = prev - 1;
    const nextNext = next + 1;

    if (index == 0) { 
        return {index, next, nextNext}
    } else if (index == arr.length - 1) { 
        return {prevPrev, prev, index}
    } else {
        return {prev, index:arr[index], next};
    }
}
console.info(getItem(1, items))

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

var items = ['bill', 'hill', 'dill', 4, 5, 6, 7, 8, 9, 10];

var arr = items.map((item, index, array) => {
  return {
    prev: item,
    index: array[index + 1],
    next: array[index + 2]
  }
});

console.info(arr)

Вот как бы я это сделал, используя внутреннюю функцию safeGet для возврата undefined, когда индексы выходят за пределы:

const items = ['bill', 'hill', 'dill', 4, 5, 6, 7, 8, 9, 10];

const getItem = (arr, i) => {
  const safeGet = i => i >= 0 && i < arr.length ? arr[i] : undefined;
  return { prev: safeGet(i-1), index: safeGet(i), next: safeGet(i+1) };
};

console.info(getItem(items, 0));
console.info(getItem(items, 2));
console.info(getItem(items, 9));
console.info(getItem(items, 20));

Другие вопросы по теме