JS: Создать метод для возврата массива, который не включает значения индекса из массива, переданного моему методу - PullRequest
3 голосов
/ 03 июня 2019

Я пытаюсь создать метод, который добавляется к объекту Array.prototype. Цель состоит в том, чтобы вернуть массив, который не включает значения индекса из массива, переданного моему методу.

Ниже приведены мои тестовые характеристики.

describe('doNotInclude', () => {
  it('the doNotInclude method is added to the Array.prototype object', () => {
    expect(typeof Array.prototype.doNotInclude).toBe('function');
  });
  it('returns an array', () => {
    expect(Array.isArray([1, 2, 3, 4].doNotInclude(3))).toBe(true);
    expect(Array.isArray([1, 2, 3, 4].doNotInclude([0, 2]))).toBe(true);
  });
  it('does not include the index values from the array passed to `doNotInclude`', () => {
    expect([1, 2, 3, 4, 5].doNotInclude([3, 4])).toEqual([1, 2, 3]);
    expect(
      ['zero', 'one', 'two', 'three', 'four', 'five', 'six'].doNotInclude([
        0,
        1,
      ])
    ).toEqual(['two', 'three', 'four', 'five', 'six']);

Мой код ниже:

Array.prototype.doNotInclude = function (arr){
    return this.filter((elem, index) => {
      if (!arr.includes(index)){
        return elem; 
      }
    })
  }

Мой код не соответствует ни одной из спецификаций. Что я делаю неправильно?

Также, чтобы проверить мое концептуальное понимание, метод фильтра запускается на каком массиве? Это тот, который содержит индексы?

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Я предполагаю, что вы хотите метод, который принимает данный массив и удаляет значения, которые соответствуют значениям массива, переданного в качестве параметра. Эта демонстрация вернет индексы массива, значения которых не совпадают со значениями переданного массива. Это возможно с помощью новейшего метода массива .flatMap(), который по существу представляет собой объединенные методы .map() и .flat(). Часть отображения будет выполнять функцию для каждого значения так же, как .map(), но разница в том, что каждый возврат представляет собой массив:

 array.map(function(x) { return x});
 array.flatMap(function(x) { return [x]});

Если вы хотите удалить значение, вы возвращаете пустой массив:

  array.map(function(x) { return x}).filter(function(x) { return x !== z}); 
  array.flatMap(function(x) { return x !== z ? [x] : []}); 

Используя троичный элемент управления, вы можете прямо, а не косвенно удалять значения с помощью .filter().

  if x does not equal z return [x] else return empty array []
    return x !== z ? [x] : []

Затем результат сливается в обычный массив.

Array.prototype.exclude = function(array) {
  return this.flatMap((value, index) => {
    return array.includes(value) ? [] : [index];
  })
}

let x = [1, 2, 3, 4, 5, 6, 7];

let z = x.exclude([3, 4]);

console.log(JSON.stringify(z));
0 голосов
/ 03 июня 2019

1) Вы не хотите return elem, вы хотите вернуть логическое значение, которое указывает, должно ли elem быть включено или нет.

2) doNotInclude(3) указывает, что arr не может быть массивом. Вы должны проверить это с помощью Array.isArray(arr) и соответственно изменить логику (сравните индекс с arr напрямую).

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