Javascript есть ли способ получить индекс массива при использовании функционального программирования?

1

В javascript я хочу использовать методы функционального программирования (например, фильтр и карту) для преобразования массива и хочу включить индекс массива в результат.

Например, у меня есть массив myArray, я его фильтрую и форматирует каждый элемент в массиве, а затем объединяю результаты вместе в одну большую строку. Это работает, за исключением того, что он не включает индекс массива.

 myArray.filter(myFilterFunction).map(prettyPrinterFunction).join(sep);

Следующий код иллюстрирует это. Вы можете скопировать/вставить его в узел для эксперимента.

class Item {
    constructor(itemNumber){
        this.itemNumber = itemNumber;
    }
    toString(){
        return "Item #" + this.itemNumber;
    }
}

function myFilter(anItem){
    return anItem.itemNumber > 3;
}

function myFormatter(anItem){
    return anItem.toString();
}

// This function does what I want
function formatArray(theArray, theFilter, theFormatter, sep = "\n"){
    var output = "";
    var newLine = "";
    for(ii = 0; ii < listOfObjects.length; ii++){
        if (myFilter(listOfObjects[ii])){
            output += newLine + ii + " " + theFormatter(listOfObjects[ii]);
        }
        newLine = sep;
    }
    return output;
}

var listOfObjects = [];
listOfObjects.push(new Item(5));
listOfObjects.push(new Item(4));
listOfObjects.push(new Item(1));
listOfObjects.push(new Item(8));

var output = formatArray(listOfObjects, myFilter, myFormatter);

console.log(output);

Это выводит индекс массива, за которым следует отформатированный результат, и это желаемый результат.

0 Item #5
1 Item #4
3 Item #8

Следующий функциональный стиль:

var output = listOfObjects.filter(myFilter).map(myFormatter).join("\n");
console.log(output);

Item #5
Item #4
Item #8

почти точно, что я хочу, но у него нет индекса массива, связанного с элементом.

Какие изменения необходимы для получения индекса массива в результатах/результатах?

Теги:
arrays

2 ответа

1
Лучший ответ

хорошо, это было весело. Здесь работает код.

Он получает результат, который вы ищете:

0 Item #5
1 Item #4
3 Item #8

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

Вот ключевые изменения:

myFormatter получает второй параметр, который является индексом элемента в массиве

и он выводит объект:

{
   index: 0,
   item: theItem
}

Итак, после первой карты у нас есть массив объектов, которые содержат исходный индекс элемента в исходном массиве и элементе. Затем мы можем фильтровать, что оставляет нас с массивом только элементов, которые проходят фильтр. Затем конечная карта создает требуемый результат, комбинируя исходный индекс в нашей временной структуре с выходом элемента в этой структуре.

class Item {
    constructor(itemNumber){
        this.itemNumber = itemNumber;
    }
    toString(){
        return "Item #" + this.itemNumber;
    }
}

function myFilter(element){
    return element.item.itemNumber > 3;
}

function myFormatter(item, index){
    return {index, item};
}

var listOfObjects = [];
listOfObjects.push(new Item(5));
listOfObjects.push(new Item(4));
listOfObjects.push(new Item(1));
listOfObjects.push(new Item(8));

// var output = formatArray(listOfObjects, myFilter, myFormatter);
const output = listOfObjects
  .map(myFormatter)
  .filter(myFilter)
  .map(e => '${e.index} ${e.item}')
  .join("\n");

console.log(output);
  • 1
    Это работает. Спасибо за ответ. Сначала я думал, что другой ответ был правильным, и он казался более простым, но он не был правильным. Другой ответ не сохранил исходные номера индексов (как и ваш ответ).
1

Оформить синтаксис для Array.prototype.map():

var new_array = arr.map(function callback(currentValue, index, array) {
    // Return element for new_array
}[, thisArg])

Runnable Пример:

https://jsbin.com/bopodehaku/1/edit?js,console

Mozilla Ссылка:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map?v=example

  • 0
    Это не совсем правильно. Полученный вывод не имеет индексов исходного массива правильно, потому что фильтр изменил массив, поэтому другой ответ (который сначала создает карту для сохранения исходного индекса) является правильным ответом. Но спасибо за ответ. `` `0 Item # 5 1 Item # 4 2 Item # 8` `` Но так и должно быть: `` `0 Item # 5 1 Item # 4 3 Item # 8" `` `

Ещё вопросы

Сообщество Overcoder
Наверх
Меню