длина массива с ключом-значением, Джс - PullRequest
3 голосов
/ 16 декабря 2011

Я написал этот фрагмент кода, который должен анализировать данный paramUnparsed (который должен быть массивом в виде: [key1 = val1, key2 = val2, .., keyn = valn] ).

function parseParams(paramUnparsed){
var params = [];
for ( var j = 0; j < paramUnparsed.length; j++) {
    if (paramUnparsed[j].split('=').length < 2) {
        // error ! bad input structure, ignoring params -

        params = undefined;
        break; // we don't have to return error, depending
                // on the function called and given params.

    }
    //else {
        var key = paramUnparsed[j].split('=')[0];
        var value = paramUnparsed[j].split('=')[1];
        params[key] = value;
    //}
}

console.log("In parseParams, params are: "+ concatObject(params));//DEBUG 1
console.log("In parseParams, params length is: "+ params.length);//DEBUG 2
return params;  
}

Как я могу это сделать, и все же определить длину массива, который я создаю? Я всегда получаю «0» на распечатке «DEBUG 2» ...

Ответы [ 4 ]

11 голосов
/ 16 декабря 2011

Созданный массив "params" является ассоциативным массивом.Если вы хотите получить длину ассоциативного массива, используйте

Object.keys(params).length;
3 голосов
/ 16 декабря 2011

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

Создайте объект и посчитайтепредметы, которые вы добавляете для подсчета:

function parseParams(paramUnparsed){
  var params = {}, cnt = 0;
  for (var j = 0; j < paramUnparsed.length; j++) {
    if (paramUnparsed[j].split('=').length < 2) {
      // error ! bad input structure, ignoring params -

      params = undefined;
      break; // we don't have to return error, depending
             // on the function called and given params.

    }
    var key = paramUnparsed[j].split('=')[0];
    var value = paramUnparsed[j].split('=')[1];
    params[key] = value;
    cnt++;
  }

  console.log("In parseParams, params are: "+ concatObject(params));//DEBUG 1
  console.log("In parseParams, params length is: "+ cnt);//DEBUG 2
  return params;  
}
1 голос
/ 16 декабря 2011

Вы на самом деле не строите массив. Массивы не должны иметь ключей. Вы можете использовать объект, подобный этому:

var params = {};

но это не решит вашу проблему .length.

Что вы также можете сделать, это создать массив объектов, где каждый объект содержит ключ и значение. Примерно так:

function parseParams(paramUnparsed){
    var params = [];
    for (var j = 0; j < paramUnparsed.length; j++) {
        if (paramUnparsed[j].split('=').length < 2) {
            params = undefined;
            break;
        }

        var key = paramUnparsed[j].split('=')[0];
        var value = paramUnparsed[j].split('=')[1];
        params.push({ key: key, value: value });
    }

    // use like: `params[0].key` etc

    return params; 
}
0 голосов
/ 04 марта 2019

Вот что-то странное. Это на самом деле держится вместе.

var arr = [];
arr["test"] = "something";
arr[arr.length]=arr["test"];

Теперь у вас есть массив значений ключей, который вы можете пройти по ключу или по индексу Также доступно свойство length.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...