ActionScript 3 Невозможно добавить и удалить элемент из массива

63
5

Я работаю над приложением списка покупок, и у меня проблема с удалением и добавлением элемента в массив.

У меня есть output_txt.text и input_txt.text с тремя кнопками add_btn, remove_btn и clear_btn. В моем списке (выходе) у меня есть предметы "Хлеб, корм для собак, яйца, гамбургер, молоко". Я хочу иметь возможность добавлять элементы в список и сортировать их по алфавиту.

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

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

(TotalItems_txt.text - это общее количество элементов, которые я добавляю и удаляю из списка.)

Вот мой код:

clear_btn.addEventListener(MouseEvent.CLICK, ClearList);
function ClearList(e:MouseEvent):void {
output_txt.text = "";
totalItems_txt.text = "0";
}

addItem_btn.addEventListener(MouseEvent.CLICK, AddItem);
function AddItem(e:MouseEvent):void {
var newItems:Array = ["Bread", "Dog Food", "Eggs", "Hamburger", "Milk"];
newItems[0] = "Bread";
newItems[1] = "Dog Food";
newItems[2] = "Eggs";
newItems[3] = "Hamburger";
newItems[4] = "Milk";
newItems[5] = input_txt.text;
newItems.sort(Array.CASEINSENSITIVE);
input_txt.text = "";
output_txt.text = "";
for (var i:int = 0; i < newItems.length; i++){
output_txt.appendText(newItems[i] + "\n");
}
totalItems_txt.text = newItems.length.toString();
}

remove_btn.addEventListener(MouseEvent.CLICK, RemoveItems);
function RemoveItems(e:MouseEvent):void {
var items:Array = ["Bread", "Dog Food", "Eggs", "Hamburger", "Milk"];
items[0] = "Bread";
items[1] = "Dog Food";
items[2] = "Eggs";
items[3] = "Hamburger";
items[4] = "Milk";
items[5] = input_txt.text;
output_txt.text = "";
items.splice(1,1);
for (var i:int = 0; i < items.length; i++){
output_txt.appendText(items[i] + "\n");
}
totalItems_txt.text = items.length.toString();
}

спросил(а) 2021-01-25T15:23:43+03:00 4 месяца, 3 недели назад
1
Решение
63

Легче определить причину проблемы, если вы предоставите полный и проверяемый пример, однако в основе вашей проблемы лежит понимание методов Array:

splice(startIndex:int, deleteCount:uint), для удаления элементов. push(... args), для добавления элементов.

Если вы явно ссылаетесь на newItems[0] через [5], то вы будете влиять только на записи newItems[0], однако push полезен, так как он просто добавляет его в конец вашего массива. И наоборот, вы можете использовать либо splice (специально предназначенный для определенного индекса), либо pop() (который удаляет последний элемент из массива) для удаления элементов из вашего массива.

Другая проблема заключается в том, что ваши массивы являются локальными. Поскольку вы воссоздаете их каждый раз, когда вы вызываете RemoveItems или AddItem, вы никогда не сохраните изменения. Итак, переместите его за пределы этих функций, и он будет сохранен между кликами.

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

import flash.text.TextField;
import flash.events.KeyboardEvent;
import flash.display.Sprite;

var items:Array = ["Bread", "Dog Food", "Eggs", "Hamburger", "Milk"];

function addItem(e:MouseEvent):void {
if (input_txt.text != "") { // Assuming we having something in the input_txt,
items.push(input_txt.text); // add it to the end of our items array
input_txt.text = "";
updateOutput();
}
}

function removeItems(e:MouseEvent):void {
items.splice(0,1);
updateOutput();
}

function clearList(e:MouseEvent):void {
items = []; // empty our list by replacing it with a new one.
output_txt.text = "";
totalItems_txt.text = "0";
}

function updateOutput():void {
items.sort(Array.CASEINSENSITIVE);
output_txt.text = "";
for (var i:int = 0; i < items.length; i++){
output_txt.appendText(items[i] + "\n");
}
totalItems_txt.text = "Total: " + items.length;
}

/* Supplemental UI Creation */

var addItem_btn:Sprite = new Sprite();
addItem_btn.graphics.beginFill(0xa1FFa1,1);
addItem_btn.graphics.drawRect(0,0,100,25)
addChild(addItem_btn);
addItem_btn.addEventListener(MouseEvent.CLICK, addItem);

var clear_btn:Sprite = new Sprite();
clear_btn.graphics.beginFill(0xa1a1a1,1);
clear_btn.graphics.drawRect(0,0,100,25)
addChild(clear_btn);
clear_btn.x = 101;
clear_btn.addEventListener(MouseEvent.CLICK, clearList);

var remove_btn:Sprite = new Sprite();
remove_btn.graphics.beginFill(0xFFa1a1,1);
remove_btn.graphics.drawRect(0,0,100,25)
addChild(remove_btn);
remove_btn.x = 202;
remove_btn.addEventListener(MouseEvent.CLICK, removeItems);

var input_txt:TextField = new TextField();
addChild(input_txt);
input_txt.type = "input";
input_txt.text = "input_txt";
input_txt.y = 50;

var output_txt:TextField = new TextField();
addChild(output_txt);
output_txt.text = "output_txt";
output_txt.y = 50;
output_txt.x = 101;

var totalItems_txt:TextField = new TextField();
addChild(totalItems_txt);
totalItems_txt.text = "totalItems_txt";
totalItems_txt.y = 50;
totalItems_txt.x = 202;

ответил(а) 2021-01-25T15:23:43+03:00 4 месяца, 3 недели назад
45

Все, что вам нужно было сделать, - объявить массив как общедоступный, а затем добавить только значения в массив с помощью push(). при сортировке фактический индекс массива по-прежнему остается, но индекс отображаемых элементов будет другим,

ответил(а) 2021-01-25T15:23:43+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема