Как расширить существующий массив JavaScript другим массивом, не создавая новый массив

Но в основном я просто хочу знать, как заставить изображение перемещаться влево вправо, когда окно прослушивает нажатие клавиши

. Вы можете использовать таймер Swing для анимации image:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TimerAnimation extends JLabel implements ActionListener
{
    int deltaX = 2;
    int deltaY = 3;
    int directionX = 1;
    int directionY = 1;

    public TimerAnimation(
        int startX, int startY,
        int deltaX, int deltaY,
        int directionX, int directionY,
        int delay)
    {
        this.deltaX = deltaX;
        this.deltaY = deltaY;
        this.directionX = directionX;
        this.directionY = directionY;

        setIcon( new ImageIcon("dukewavered.gif") );
//      setIcon( new ImageIcon("copy16.gif") );
        setSize( getPreferredSize() );
        setLocation(startX, startY);
        new javax.swing.Timer(delay, this).start();
    }

    public void actionPerformed(ActionEvent e)
    {
        Container parent = getParent();

        //  Determine next X position

        int nextX = getLocation().x + (deltaX * directionX);

        if (nextX < 0)
        {
            nextX = 0;
            directionX *= -1;
        }

        if ( nextX + getSize().width > parent.getSize().width)
        {
            nextX = parent.getSize().width - getSize().width;
            directionX *= -1;
        }

        //  Determine next Y position

        int nextY = getLocation().y + (deltaY * directionY);

        if (nextY < 0)
        {
            nextY = 0;
            directionY *= -1;
        }

        if ( nextY + getSize().height > parent.getSize().height)
        {
            nextY = parent.getSize().height - getSize().height;
            directionY *= -1;
        }

        //  Move the label

        setLocation(nextX, nextY);
    }

    public static void main(String[] args)
    {
        JPanel panel = new JPanel();
        JFrame frame = new JFrame();

        frame.setContentPane(panel);
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.getContentPane().setLayout(null);
//      frame.getContentPane().add( new TimerAnimation(10, 10, 2, 3, 1, 1, 10) );
        frame.getContentPane().add( new TimerAnimation(300, 100, 3, 2, -1, 1, 20) );
//      frame.getContentPane().add( new TimerAnimation(0, 000, 5, 0, 1, 1, 20) );
        frame.getContentPane().add( new TimerAnimation(0, 200, 5, 0, 1, 1, 80) );
        frame.setSize(400, 400);
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
//      frame.getContentPane().add( new TimerAnimation(10, 10, 2, 3, 1, 1, 10) );
//      frame.getContentPane().add( new TimerAnimation(10, 10, 3, 0, 1, 1, 10) );
    }
}

Вы можете добавить KeyListener на панель и работать независимо от анимации изображения.

850
задан Peter Mortensen 15 October 2018 в 17:49
поделиться

3 ответа

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

>>> a.push(...b)

Если ваш браузер не поддерживает ECMAScript 6, вы можете использовать .apply вместо:

>>> a.push.apply(a, b)

Или, возможно, если вы думаете, что это яснее:

>>> Array.prototype.push.apply(a,b)

Обратите внимание, что все эти решения завершатся ошибкой с переполнением стека, если массив b слишком длинный (проблема начинается примерно с 100 000 элементов, в зависимости от браузера). Если вы не можете гарантировать, что b достаточно короткое, вам следует использовать стандартный метод на основе цикла, описанный в другом ответе.

1374
ответ дан 22 November 2019 в 21:03
поделиться

Это решение работает для меня (с использованием оператора распространения ECMAScript & nbsp; 6):

let array = ['my', 'solution', 'works'];
let newArray = [];
let newArray2 = [];
newArray.push(...array); // Adding to same array
newArray2.push([...array]); // Adding as child/leaf/sub-array
console.log(newArray);
console.log(newArray2);
3
ответ дан Peter Mortensen 15 October 2018 в 17:49
поделиться

Это можно сделать с помощью splice () :

b.unshift(b.length)
b.unshift(a.length)
Array.prototype.splice.apply(a,b) 
b.shift() // Restore b
b.shift() // 

Но, несмотря на уродливость, он не быстрее, чем push.apply , при по крайней мере, в Firefox 3.0.

12
ответ дан 22 November 2019 в 21:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: