13

Webkitで次のコードを実行しています。

var scriptElements = document.scripts;
var scriptUrls = [];
// URL matching
var regexp = /\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’]))/i;
for (var i = 0; i < scriptElements.length; i++) {
    element = scriptElements[i];
    var urls = element.innerHTML.match(regexp);
    console.log('local', urls);
    scriptUrls.concat(urls);
    console.log('global', scriptUrls);
}

'local'の後に空でない配列が出力されますが、'global'は常に空の配列のままです。どうしたの?

4

2 に答える 2

57

.concat新しいアレイを作成します。古いものを上書きする必要があります。

scriptUrls = scriptUrls.concat(urls);

または、元のscriptUrls配列を保持する場合は.push()、の値を使用できます。

scriptUrls.push.apply(scriptUrls, urls);

これは、に渡される個々の引数.apply()に変換するために使用します。このようにして、のコンテンツが個別のアイテムとして追加されます。urls.push()urlsscriptUrls


また、アレイを.concat() フラット化することに注意してください。配列の配列が必要な場合は、を使用しますscriptUrls.push(urls)

于 2012-10-10T00:38:31.673 に答える
2

concatは、これまたは引数として提供された配列を変更しませんが、代わりに、元の配列から結合された同じ要素のコピーを含む「1レベルの深さ」のコピーを返します。

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/concat

于 2012-10-10T00:42:07.120 に答える