javascript/jquery:单击将相关数组项复制到新数组
javascript/jquery: on click copy relevant array items to new array
我想我错过了一个明显的答案。我有一个数组数组,像这样
var arraylist = [
{
"id" = 0,
"title" = "title number 1",
"info" = "some info etc 1"
},
{
"id" = 1,
"title" = "title number 2",
"info" = "some info etc 2"
},
]
...等还有一个函数,它从每个数组中生成一些 html,附加到 ul 元素。
function makeBox(){
for (i = 0; i < arraylist.length; i++ ) {
var boxHTML = '<li id="' + arraylist[i].id + '">'
+ '<div>' + arraylist[i].title + '</div>'
+ '</li>'
$('ul').append(boxHTML);
};
};
现在使用点击功能,点击 'li' 我希望将 arraylist 中的相关数组复制到新数组。
newArrayList = []
所以点击 li #0 会将第一个数组从 'arraylist' 复制到 'newArrayList'。
然后我将使用不同的值使 HTML 与 'newArrayList' 不同。所以在 makeBox 函数中我不会显示值 "info",但是当我从 newArrayList 生成 HTML 时我会。
我可以使用 innerHTML 将数据从 HTML 返回到 newArrayList,但必须将 "info" 附加到隐藏的跨度或其他内容。这似乎是一个漫长的过程。那么简单的方法是什么?
我只是在学习所以对我放轻松。也做了很好的搜索,找不到答案。如果已经存在,请礼貌地指导我。
所以几点说明:
- 它不是数组的数组。它是一个对象数组。
[ ]
块
是一个数组。 { }
是一个对象。
$('ul')
将 select 页面上的所有 uls,不一定只是
一个你想要的。
对象结构不正确,应该使用冒号(:
)
大于等于 (=
) 个字符。它应该看起来更像这样:
var arraylist = [{
"id": 0,
"title": "title number 1",
"info": "some info etc 1"
}, {
"id": 1,
"title": "title number 2",
"info": "some info etc 2"
}]
这是您的函数的修改版本。
function makeBox(){
var $ul = $('ul.from_array_one');
for (var i = 0; i < arraylist.length; i++) {
var item = arraylist[i];
var $boxHTML = $('<li id="' + item.id + '">' + item.title + '</li>');
$boxHTML.click(onSelectItem(item));
$ul.append($boxHTML);
};
};
其中存在接受数组对象项的新函数,例如:
function onSelectItem( item ){
return function(){
var $ul2 = $('ul.from_array_two');
var $boxHTML2 = $('<li id="' + item.id + '">' + item.info + '</li>');
$ul2.append($boxHTML2);
}
}
Shaun 的解决方案在正确实施后应该有效(您的努力加一分)。
这是另一种方法。
我修改了您的 (OP) 函数,因此可以重复用于其他相同类型的数组。由于您正在学习,我鼓励您继续阅读 DRY principle a.k.a。 "don't repeat yourself"。在设计代码时坚持这一原则,将帮助您编写更可重用的代码,从而使代码更短,更长 运行 更易于维护的代码库。在此过程中,您将成为更好的编码员。
var arraylist = [
{
"id": 0,
"title": "title number 1",
"info": "some info etc 1"
},
{
"id" : 1,
"title": "title number 2",
"info": "some info etc 2"
},
];
var newArrayList = [];
///
function makeBox(arrayToMake, ulToAppendTo, liClass){
for (i = 0; i < arrayToMake.length; i++ ) {
var boxHTML = '<li class="'+liClass+'" id="' + arrayToMake[i].id + '">'
+ '<div>' + arrayToMake[i].title + '</div>'
+ '</li>'
$(ulToAppendTo).append(boxHTML);
};
};
var firstListClass = "first_list_item";
var secondListClass = "second_list_item";
makeBox(arraylist,'.ul_one',firstListClass);
$("."+firstListClass).click(function(){
copyArray(arraylist,newArrayList);
makeBox(newArrayList,'.ul_two',secondListClass);
});
function copyArray(sourceArray, targetArray)
{
sourceArray.forEach(function(item){
//for demo purpose only
item.title="new title " + item.id;
targetArray.push(item);
});}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>first array result</p>
<ul class='ul_one'></ul>
<p>new array result</p>
<ul class='ul_two'></ul>
我想我错过了一个明显的答案。我有一个数组数组,像这样
var arraylist = [
{
"id" = 0,
"title" = "title number 1",
"info" = "some info etc 1"
},
{
"id" = 1,
"title" = "title number 2",
"info" = "some info etc 2"
},
]
...等还有一个函数,它从每个数组中生成一些 html,附加到 ul 元素。
function makeBox(){
for (i = 0; i < arraylist.length; i++ ) {
var boxHTML = '<li id="' + arraylist[i].id + '">'
+ '<div>' + arraylist[i].title + '</div>'
+ '</li>'
$('ul').append(boxHTML);
};
};
现在使用点击功能,点击 'li' 我希望将 arraylist 中的相关数组复制到新数组。
newArrayList = []
所以点击 li #0 会将第一个数组从 'arraylist' 复制到 'newArrayList'。
然后我将使用不同的值使 HTML 与 'newArrayList' 不同。所以在 makeBox 函数中我不会显示值 "info",但是当我从 newArrayList 生成 HTML 时我会。 我可以使用 innerHTML 将数据从 HTML 返回到 newArrayList,但必须将 "info" 附加到隐藏的跨度或其他内容。这似乎是一个漫长的过程。那么简单的方法是什么?
我只是在学习所以对我放轻松。也做了很好的搜索,找不到答案。如果已经存在,请礼貌地指导我。
所以几点说明:
- 它不是数组的数组。它是一个对象数组。
[ ]
块 是一个数组。{ }
是一个对象。 $('ul')
将 select 页面上的所有 uls,不一定只是 一个你想要的。对象结构不正确,应该使用冒号(
:
) 大于等于 (=
) 个字符。它应该看起来更像这样:var arraylist = [{ "id": 0, "title": "title number 1", "info": "some info etc 1" }, { "id": 1, "title": "title number 2", "info": "some info etc 2" }]
这是您的函数的修改版本。
function makeBox(){
var $ul = $('ul.from_array_one');
for (var i = 0; i < arraylist.length; i++) {
var item = arraylist[i];
var $boxHTML = $('<li id="' + item.id + '">' + item.title + '</li>');
$boxHTML.click(onSelectItem(item));
$ul.append($boxHTML);
};
};
其中存在接受数组对象项的新函数,例如:
function onSelectItem( item ){
return function(){
var $ul2 = $('ul.from_array_two');
var $boxHTML2 = $('<li id="' + item.id + '">' + item.info + '</li>');
$ul2.append($boxHTML2);
}
}
Shaun 的解决方案在正确实施后应该有效(您的努力加一分)。
这是另一种方法。
我修改了您的 (OP) 函数,因此可以重复用于其他相同类型的数组。由于您正在学习,我鼓励您继续阅读 DRY principle a.k.a。 "don't repeat yourself"。在设计代码时坚持这一原则,将帮助您编写更可重用的代码,从而使代码更短,更长 运行 更易于维护的代码库。在此过程中,您将成为更好的编码员。
var arraylist = [
{
"id": 0,
"title": "title number 1",
"info": "some info etc 1"
},
{
"id" : 1,
"title": "title number 2",
"info": "some info etc 2"
},
];
var newArrayList = [];
///
function makeBox(arrayToMake, ulToAppendTo, liClass){
for (i = 0; i < arrayToMake.length; i++ ) {
var boxHTML = '<li class="'+liClass+'" id="' + arrayToMake[i].id + '">'
+ '<div>' + arrayToMake[i].title + '</div>'
+ '</li>'
$(ulToAppendTo).append(boxHTML);
};
};
var firstListClass = "first_list_item";
var secondListClass = "second_list_item";
makeBox(arraylist,'.ul_one',firstListClass);
$("."+firstListClass).click(function(){
copyArray(arraylist,newArrayList);
makeBox(newArrayList,'.ul_two',secondListClass);
});
function copyArray(sourceArray, targetArray)
{
sourceArray.forEach(function(item){
//for demo purpose only
item.title="new title " + item.id;
targetArray.push(item);
});}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>first array result</p>
<ul class='ul_one'></ul>
<p>new array result</p>
<ul class='ul_two'></ul>