2011-01-21 2 views
12

Here - мой пример. Можете ли вы сказать мне, как я могу сделать массив имеют последовательные ключиJavascript - Reindexing массив

array[0] 
array[1] 
array[2] 

когда я

var testArray = new Array(); 
testArray[3]="qwerty"; 
testArray[7]="asdfgh"; 
testArray[13]="zxcvbn"; 
var testString = testArray.join(); 

Примечание редактора: автор вопроса хочет индексировать его массив.

+1

сделать массив какой? – WarrenFaith

+1

Он, вероятно, хочет переиндексировать массив, судя по его скрипке. –

+0

@warren; в моем примере массивы ключей - 3, 7, 13. Когда я сериализовал их, он стал «,,, qwerty ,,,, asdfgh ,,,,,, zxcvbn». Я хочу «qwerty, asdfgh, zxcvbn». – borayeris

ответ

8

Если вы не возражаете против использования JavaScript 1.6: (примечание: этот код использует библиотеку JQuery)

var testArray = new Array(); 
testArray[3]="qwerty"; 
testArray[7]="asdfgh"; 
testArray[13]="zxcvbn"; 
var testString = testArray.filter(function (item) { return item != undefined }).join(); 

$(function(){ 
    $('#write').text(testString); 
}); 

фильтр-прототип:

if (!Array.prototype.filter) 
{ 
    Array.prototype.filter = function(fun /*, thisp */) 
    { 
    "use strict"; 

    if (this === void 0 || this === null) 
     throw new TypeError(); 

    var t = Object(this); 
    var len = t.length >>> 0; 
    if (typeof fun !== "function") 
     throw new TypeError(); 

    var res = []; 
    var thisp = arguments[1]; 
    for (var i = 0; i < len; i++) 
    { 
     if (i in t) 
     { 
     var val = t[i]; // in case fun mutates this 
     if (fun.call(thisp, val, i, t)) 
      res.push(val); 
     } 
    } 

    return res; 
    }; 
} 
+0

Я просто скопировал его код из JsFiddle, но поставил римейк для другого пользователя. Спасибо за головы. – Exelian

+0

Спасибо, Exalian. – borayeris

0

вы имеете в виду без запятых? если да, просто сделайте это var testString = testArray.join(""); или вы можете добавить любой символ, который вы хотите между.

+0

Мне нужна переиндексация массива. Не это. – borayeris

+0

, вы всегда можете просто присоединиться к массиву, а затем отложить его с помощью определенного разделителя. Может быть, это не тот про, а его 2 строки кода. – elasticrash

+0

присоединение и повторное разделение не будут работать, если элементы массива являются объектами, например –

0

Попробуйте Этот

var testArray=testArray.join(" "); 
+0

. Мне нужно переиндексировать массив. Не это. – borayeris

2
var testArray = new Array(); 
testArray[3] = "qwerty"; 
testArray[7] = "asdfgh"; 
testArray[13] = "zxcvbn"; 


var isEmpty = function(x) { 
    // returns true if x is null and false if it is not. 
    if(x!=null){ 
     return true; 
    }else{ 
     return false 
    } 
} 
var newArray=testArray.filter(isEmpty); 

var testString2 = newArray.join(); 

$('#write').text(testString2); 
2

Супер простой функции:

function reindex_array_keys(array, start){ 
    var temp = []; 
    start = typeof start == 'undefined' ? 0 : start; 
    start = typeof start != 'number' ? 0 : start; 
    for(var i in array){ 
     temp[start++] = array[i]; 
    } 
    return temp; 
} 
testArray = reindex_array_keys(testArray); 

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

testArray = reindex_array_keys(testArray, 3); 

, который будет производить 3 «неопределенные» элементы в начале массива. вы можете потом добавить к нему позже, но я думаю, что было бы лучше сделать testArray.unshift('newValue') сначала, а затем переиндексировать лично.

весело

+0

Uncaught ReferenceError: i не определен – fdrv

20

Array.prototype.filter() не выполняется на удаленных или ранее неопределенных элементов. Таким образом, вы можете просто:

testArray.filter(function(val){return val}); 

..Для переиндексации массива.

Или ES6:

testArray.filter(val => val) 
+1

Ding ding ding - самый короткий ответ и не требует использования операторов сравнения. – aendrew

+2

Обратите внимание, что он вернет новый массив, не затрагивая 'testArray'. Вы можете переопределить его: 'testArray = testArray.filter (val => val);' – pmrotule

+0

@pmrotule, если вы хотите сохранить его, да. Следуя примеру в вопросе, самым коротким будет «var testString = testArray.filter (val => val) .join();' – Redsandro

Смежные вопросы