JavaScript Array.concat и обходной путь push

Всегда сложно думать о Array.concat. Часто я просто хочу использовать изменяемый Array.push, потому что я просто добавляю дополнительные данные к неизменяемым данным. Итак, я обычно делаю:

array[array.length] = newData;

Я задал вопрос, на который есть ответы здесь: Как хранить данные функциональной цепочки

const L = (a) => {
  const m = a => (m.list ? m.list : m.list = [])
        .push(a) && m; 
  //use `concat` and refactor needed instead of `push` 
  //that is not immutable
  return m(a); // Object construction!
};

console.info(L);
console.info(L(2));
console.info(L(1)(2)(3))

некоторые выходы:

{ [Function: m] list: [ 2 ] } 
{ [Function: m] list: [ 1, 2, 3 ] }

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

В принципе, я хочу:

arr1 = arr1.concat(arr2);

но есть ли способ написать

arr1[arr1.length] = arr2;

который заканчивается вложенным массивом и не работает.

Что именно ты пытаешься сделать? Пожалуйста, будьте яснее.

Sebastian Olsen 11.07.2018 13:24
const m = a => (m.list ? m.list : m.list = []).push(a) && m; Это ... довольно запутанная фраза ...
CertainPerformance 11.07.2018 13:26
a.push(...b) - хочешь этого?
31piy 11.07.2018 13:28

@ vibhor1997a - arr1[arr1.length] = ...arr2; - это даже неверный синтаксис.

31piy 11.07.2018 13:29

@ 31piy, вы сказали, что a.push(...b) не является допустимым синтаксисом?

Ivan 11.07.2018 13:29

Не работает, синтаксическая ошибка @ 31piy

user6440264 11.07.2018 13:43
Поведение ключевого слова "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) для оценки ваших знаний,...
1
6
298
3

Ответы 3

arr1[arr1.length] представляет собой единственное значение, значение с индексом arr1.length.

Представьте себе этот массив

[ 1 , 2 , 3 , 4 ]  // arr of length 4
  ^0  ^1  ^2  ^3   // indexes

Если мы скажем arr1[arr1.length] = someThing

Просим javascript что-то прямо сюда поставить, и только здесь, по индексу 4:

[ 1 , 2 , 3 , 4 ,   ] // arr of length 4
  ^0  ^1  ^2  ^3  ^4  // add someThing in index 4

Итак, если мы хотим добавить что-то строго с arr1[arr1.length], нам нужно продолжать делать это для каждого индекса. для каждого означает любой цикл. НАПРИМЕР:

// Not recommended to use
var arr1 = [1,2,3];
var arr2 = [3,4,5];

while (arr2.length){
  arr1[arr1.length] = arr2.shift();
}

console.info(arr1); // [1,2,3,3,4,5]
console.info(arr2); // []

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

Поскольку вы упоминаете функциональный, который возвращается является результирующим массивом, вы можете просто заменить исходный массив и использовать оператор распространения:

var arr1 = [1,2,3];
var arr2 = [3,4,5];
console.info(arr1 = [...arr1,...arr2]); // [1,2,3,3,4,5]

@Axnyff Я действительно поторопился. Улучшил ответ

Adelin 11.07.2018 14:26

@ Аделин Еще раз большое спасибо. Я согласен с вами, что в этом вопросе лучший оператор спреда.

user6440264 11.07.2018 18:39

Вы можете использовать несколько параметров в Array.push, поэтому:

var a = [];
a.push(3, 4) // a is now [3, 4]

В сочетании с ES6 синтаксис распространения:

var a = [1, 2];
var b = [3, 4]
a.push(...b); // a is now [1, 2, 3, 4] 

Я в основном хочу избегать использования push. просто потому, что функция не возвращает Array. В этом весь смысл. Спасибо.

user6440264 11.07.2018 13:39

Что вы хотите сделать, почему вы хотите вернуть массив?

Axnyff 11.07.2018 13:42

Проще говоря, это функциональное программирование.

user6440264 11.07.2018 13:47

Вы можете назначить новый массив с массивом по умолчанию для не заданного m.list.

const L = (a) => {
        const m = a => (m.list = (m.list || []).concat(a), m);
        return m(a);
    };

console.info(L.list);
console.info(L(2).list);
console.info(L(1)(2)(3).list);

Спасибо, но это все еще Разрушительное задание, которое я обычно никогда не выполняю.

user6440264 11.07.2018 13:41

пожалуйста, добавьте то, что вы хотите. как я понял вопрос и некоторые комментарии, вы хотели бы избежать push, вы хотите вернуть массив и не хотите переназначать массив list. зачем вам метод, возвращающий массив?

Nina Scholz 11.07.2018 13:45

Пожалуйста, прочтите последние 3 строки. Спасибо, я занимаюсь функциональным программированием и не использую функцию саморегулирования, то есть push.

user6440264 11.07.2018 13:48

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