Всегда сложно думать о 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;
который заканчивается вложенным массивом и не работает.
const m = a => (m.list ? m.list : m.list = []).push(a) && m; Это ... довольно запутанная фраза ...
a.push(...b) - хочешь этого?
@ vibhor1997a - arr1[arr1.length] = ...arr2; - это даже неверный синтаксис.
@ 31piy, вы сказали, что a.push(...b) не является допустимым синтаксисом?
Не работает, синтаксическая ошибка @ 31piy



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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 Я действительно поторопился. Улучшил ответ
@ Аделин Еще раз большое спасибо. Я согласен с вами, что в этом вопросе лучший оператор спреда.
Вы можете использовать несколько параметров в 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. В этом весь смысл. Спасибо.
Что вы хотите сделать, почему вы хотите вернуть массив?
Проще говоря, это функциональное программирование.
Вы можете назначить новый массив с массивом по умолчанию для не заданного 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);Спасибо, но это все еще Разрушительное задание, которое я обычно никогда не выполняю.
пожалуйста, добавьте то, что вы хотите. как я понял вопрос и некоторые комментарии, вы хотели бы избежать push, вы хотите вернуть массив и не хотите переназначать массив list. зачем вам метод, возвращающий массив?
Пожалуйста, прочтите последние 3 строки. Спасибо, я занимаюсь функциональным программированием и не использую функцию саморегулирования, то есть push.
Что именно ты пытаешься сделать? Пожалуйста, будьте яснее.