我想删除一个带有函数多次出现的数组中的元素.
var array=["hello","hello","world",1,"world"];
function removeItem(item){
for(i in array){
if(array[i]==item) array.splice(i,1);
}
}
Run Code Online (Sandbox Code Playgroud)
removeItem("world");
//Return hello,hello,1
Run Code Online (Sandbox Code Playgroud)
removeItem("hello");
//Return hello,world,1,world
Run Code Online (Sandbox Code Playgroud)
当循环重复两次时,此循环不会删除该元素,只删除其中一个元素.
为什么?
当我这样做:
var testArray = ["a","b","c"];
console.log(testArray);
console.log("size:" + testArray.length);
Run Code Online (Sandbox Code Playgroud)
我把它印在我的控制台上:
["a", "b", "c"]
size:3
Run Code Online (Sandbox Code Playgroud)
这很好.但是现在我开始拼接这个:
var testArray = ["a","b","c"];
console.log(testArray);
console.log("size:" + testArray.length);
testArray = testArray.splice(0,1);
Run Code Online (Sandbox Code Playgroud)
这恰好在我的控制台中显示:
["b", "c", undefined × 1]
size:3
Run Code Online (Sandbox Code Playgroud)
所以第一个问题是,为什么即使拼接在打印之后它也会弄乱我的阵列打印?大小显示正确,但"a"消失了,我最后得到一个未定义的.
所以我想要做的是删除数组中的第一项.基本上是一个转变.所以我这样做:
var testArray = ["a","b","c"];
console.log(testArray);
console.log("size:" + testArray.length);
testArray = testArray.splice(0,1);
console.log(testArray);
console.log("size:" + testArray.length);
Run Code Online (Sandbox Code Playgroud)
这就是输出的内容:
["b", "c", undefined × 1]
size:3
["a"]
size:1
Run Code Online (Sandbox Code Playgroud)
不仅大小减少了2,它还删除了除"a"之外的所有内容.到底是怎么回事?
我正在尝试以下方法:
var a1 = ['a', 'e', 'f']; // [a, e, f]
var a2 = ['b', 'c', 'd']; // [b, c, d]
a1.splice(1, 0, a2); // expected [a, b, c, d, e, f]
// actual (a, [b, c, d], e, f]
Run Code Online (Sandbox Code Playgroud)
通过将a2作为不确定大小的数组存在,我被限制在我的用例中.有没有人知道一种方法来拼接一个数组作为替换,或者一个内置函数来做到这一点?我知道我可以迭代a2的元素并一次一个地拼接它们,但我更喜欢最快的方法,因为我需要做很多事情.
我有这个代码,它应该遍历数组中的每个项目,根据某些条件删除项目:
//iterate over all items in an array
//if the item is "b", remove it.
var array = ["a", "b", "c"];
array.forEach(function(item) {
if(item === "b") {
array.splice(array.indexOf(item), 1);
}
console.log(item);
});
Run Code Online (Sandbox Code Playgroud)
期望的输出:
a
b
c
Run Code Online (Sandbox Code Playgroud)
实际产量:
a
b
Run Code Online (Sandbox Code Playgroud)
显然,本机forEach方法在每次迭代后都不会检查项是否已被删除,因此如果是,则跳过下一个项.除了覆盖forEach方法或实现我自己的类而不是数组之外,还有更好的方法吗?
编辑 - 继续我的评论,我想解决方案是只使用标准for循环.如果你有更好的方法,请随时回答.
IE7和IE8不让我拼接我的阵列(Safari,Chrome,Firefox工作):
lzaCreateAd1.weatherArray = new Array();
var jWeatherIcon = $('.weatherIcon');
jWeatherIcon.bind('click', function (){
var targetID = $(this).attr('id') + 'Box',
idVal = targetID.substr(5,1);
var jTargetBox = $('#'+targetID);
if (jTargetBox.hasClass('inactive')) {
jTargetBox.removeClass('inactive').addClass('active');
lzaCreateAd1.weatherArray.push(idVal);
} else if (jTargetBox.hasClass('active')) {
jTargetBox.removeClass('active').addClass('inactive');
lzaCreateAd1.weatherArray.splice(lzaCreateAd1.weatherArray.indexOf(idVal),1);
}
});
Run Code Online (Sandbox Code Playgroud)
IE抛出以下错误:"对象不支持此属性或方法"此行:
lzaCreateAd1.weatherArray.splice(lzaCreateAd1.weatherArray.indexOf(idVal),1);
有任何想法吗?或者按值删除数组项的其他方法?提前致谢!
我正在聊天并使用数组来保存用户.这是我的问题:
User1通过push连接并在数组中给出Index 0.User2通过push连接并在数组中获得索引1.
User1断开连接并通过splice删除.
现在User2成为索引0.
User1重新连接并通过push给出索引1.
User2断开连接,删除索引1,现在是User1.
这当然会引起问题.
所以我的问题是如何在没有其他元素的索引改变的情况下从数组中删除项目?我在这里走错了路吗?
这个问题是从MYSQL连接结果集中在IN()中的where子句中擦除结果吗?
所以,问题的简短版本.如何将GROUP_CONCAT返回的字符串转换为逗号分隔的表达式列表,IN()将其视为要循环的多个项目的列表?
NB MySQL的文档出现来指代"(逗号,分隔,列表)"作为"表达式列表",和有趣上IN()的页面中使用由IN()似乎或多或少在MySQL文档的唯一的页面永远参考表达列表.所以我不确定用于制作数组或临时表的函数是否可以在这里使用.
基于示例的长版本问题:来自这样的2表数据库:
SELECT id, name, GROUP_CONCAT(tag_id) FROM person INNER JOIN tag ON person.id = tag.person_id GROUP BY person.id;
+----+------+----------------------+
| id | name | GROUP_CONCAT(tag_id) |
+----+------+----------------------+
| 1 | Bob | 1,2 |
| 2 | Jill | 2,3 |
+----+------+----------------------+
Run Code Online (Sandbox Code Playgroud)
我该怎么转这个,因为它使用一个字符串被视为(1 = X)AND(2 = X)的逻辑等价物......
SELECT name, GROUP_CONCAT(tag.tag_id) FROM person LEFT JOIN tag ON person.id = tag.person_id
GROUP BY person.id HAVING ( ( 1 IN (GROUP_CONCAT(tag.tag_id) ) ) AND ( 2 IN (GROUP_CONCAT(tag.tag_id) ) …
Run Code Online (Sandbox Code Playgroud) 我知道我可以使用数组表示法在Python中切割字符串:str[1:6]
但是我如何拼接它?即,替换str[1:6]
为另一个字符串,可能是不同的长度?
在英特尔64和IA-32架构软件开发人员手册说,大约由单一处理器的行动("在P6更多最近的处理器系列内存排序和"第8.2.2节)重新排序如下:
读取可以使用较旧的写入到不同位置进行重新排序,但不能使用较旧的写入到同一位置.
接下来讨论与早期处理器相比放松的点时,它说:
存储缓冲区转发,当读取将写入传递到同一存储器位置时.
据我所知,"存储缓冲区转发"并未在任何地方精确定义(也不是"通过").读取将写入传递到同一位置是什么意思,因为上面说它不能通过写入同一位置来重新排序?
$custom = Array(
Array(
'name' => $name1,
'url' => $url1
),
Array(
'name' => $name_a,
'url' => $url_a
)
);
Run Code Online (Sandbox Code Playgroud)
我试图用以下内容拼接数组:
$bread_elem = array('name' => 'Golf', 'url' => $slug . $parent_slug);
array_splice($custom, 1, 0, $bread_elem);
Run Code Online (Sandbox Code Playgroud)
我希望我的数组成为以下数组,其值$sale_bread_elem
插入数组中的第一位.我看不出我做错了什么.
$custom = Array(
Array(
'name' => $name1,
'url' => $url1
),
Array(
'name' => 'Golf',
'url' => $slug . $parent_slug
),
Array(
'name' => $name_a,
'url' => $url_a
)
);
Run Code Online (Sandbox Code Playgroud) arrays ×6
javascript ×6
array-splice ×2
assembly ×1
concurrency ×1
explode ×1
expression ×1
foreach ×1
indexing ×1
intel ×1
jquery ×1
list ×1
memory-model ×1
mysql ×1
php ×1
python ×1
string ×1