Преобразование объекта JavaScript с числовыми ключами в массив


175

У меня есть такой объект, возвращающийся как JSON-ответ от сервера:

{"0":"1","1":"2","2":"3","3":"4"}

Я хочу преобразовать его в массив JavaScript следующим образом:

["1","2","3","4"]

Есть ли лучший способ сделать это? Где бы я ни читал, люди используют сложную логику, используя циклы. Так есть ли альтернативные методы для этого?



Ответы:


328

Это на самом деле очень просто с jQuery's $.map

var arr = $.map(obj, function(el) { return el });

FIDDLE

и почти так же легко без jQuery, преобразовать ключи в массив и затем отобразить значения с помощью Array.map

var arr = Object.keys(obj).map(function(k) { return obj[k] });

FIDDLE

Предполагается, что он уже проанализирован как объект javascript, и на самом деле это не JSON, который является строковым форматом, в этом случае также JSON.parseбудет необходим прогон .

В ES2015 есть Object.valuesна помощь, что делает это бризом

var arr = Object.values(obj);

1
@adeneo Сэр, не могли бы вы дать некоторые объяснения о его методах.
Нихил Агравал

1
@adeneo aka Mr. Burns ... Спасибо за это быстрое решение.
Дзеймсас Звирблис

1
@NikhilAgrawal Хитрость в том, чтобы использовать Object.keys (), который возвращает ключи объекта (= его собственные перечисляемые свойства) в виде массива . Затем мы можем использовать array.map для замены каждого ключа на соответствующее значение в новом массиве.
Антуан

1
Это ответ, но не очень дружелюбный.
Шерифдерек

1
Вопрос не был явным, но я предположил, что ключи объекта являются индексами массива по своей природе (0,1,2,3). Просто отметив, что люди должны знать, что этот метод не гарантирует какой-либо порядок в массиве; если ключи являются индексами, вам нужно явно упорядочить их, чтобы массив был построен в правильном порядке.
leejt489

107
var json = '{"0":"1","1":"2","2":"3","3":"4"}';

var parsed = JSON.parse(json);

var arr = [];

for(var x in parsed){
  arr.push(parsed[x]);
}

Надеюсь, это то, что вы после!


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

Спасибо! Идеальный ответ.
Винсент

очень близко к тому, что мне нужно, спасибо: for (var x в данных) {arr [x] = data [x]; }
Андрей

24

Вы просто делаете это как

var data = {
    "0": "1",
    "1": "2",
    "2": "3",
    "3": "4"
};
var arr = [];
for (var prop in data) {
    arr.push(data[prop]);
}
console.log(arr);

DEMO


20

Нет ничего похожего на «объект JSON» - JSON - это обозначение сериализации.

Если вы хотите превратить ваш объект яваскрипта в яваскрипт массиве , либо вы написать свой собственный цикл [который не был бы этот комплекс!], Или полагаться на underscore.js _.toArray() метод:

var obj = {"0":"1","1":"2","2":"3","3":"4"};
var yourArray = _(obj).toArray();

1
Спасибо - работает как шарм. Но как заставить это сделать то же самое для внутренних объектов (объектов внутри объектов)? Внутренние объекты должны также стать плоские элементы массива на корневом уровне (так что они могут быть переданы, скажем, datatables.net и т.д.)
Гопалакришна Палем

+1: «Нет ничего похожего на« объект JSON »- JSON - это обозначение сериализации». - Я не могу поверить, сколько раз мне приходилось слышать это, прежде чем полностью понять это.
Radbyx

9

Здесь нет ничего сложного. Зацикливайте элементы вашего объекта и присваивайте их массиву

var obj = {"0":"1","1":"2","2":"3","3":"4"};
var arr = [];
for (elem in obj) {
   arr.push(obj[elem]);
}

http://jsfiddle.net/Qq2aM/



4

Попробуй это:

var newArr = [];
$.each(JSONObject.results.bindings, function(i, obj) {
    newArr.push([obj.value]);
});

Ваше решение будет самым медленным из всех представленных здесь ... Плохо для бизнес-кода;)
HellBaby

3
var obj = {"0":"1","1":"2","2":"3","3":"4"};

var vals = Object.values(obj);

console.log(vals); //["1", "2", "3", "4"]

Еще одна альтернатива вопросу

var vals = Object.values(JSON.parse(obj)); //where json needs to be parsed

2

Используя raw javascript, предположим, что у вас есть:

var j = {0: "1", 1: "2", 2: "3", 3: "4"};

Вы можете получить значения с:

Object.keys(j).map(function(_) { return j[_]; })

Вывод:

["1", "2", "3", "4"]

2

Не уверен, что мне здесь не хватает, но простая попытка приведенного ниже кода делает свою работу. Я что-то здесь упускаю?

https://jsfiddle.net/vatsalpande/w3ew5bhq/

$(document).ready(function(){

var json = {
   "code" :"1", 
   "data" : { 
    "0" : {"id":"1","score":"44"},
    "1" : {"id":"1","score":"44"}
    }
  };

  createUpdatedJson();

  function createUpdatedJson(){

    var updatedJson = json;

    updatedJson.data = [updatedJson.data];

    $('#jsondata').html(JSON.stringify(updatedJson));


    console.log(JSON.stringify(updatedJson));
  }
 })

1

Предполагая, что у вас есть значение, подобное следующему

var obj = {"0":"1","1":"2","2":"3","3":"4"};

Затем вы можете превратить это в массив JavaScript, используя следующие

var arr = [];
json = JSON.stringify(eval('(' + obj + ')')); //convert to json string
arr = $.parseJSON(json); //convert to javascript array

Это работает и для преобразования json в мультиразмерные массивы javascript.

Ни один из других методов на этой странице, казалось, не работал полностью для меня при работе со строками, закодированными в php json, кроме метода, который я упоминаю здесь.


1

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

  function osort(obj)
  {  // map the object to an array [key, obj[key]]
    return Object.keys(obj).map(function(key) { return [key, obj[key]] }).sort(
      function (keya, keyb)
      { // sort(from largest to smallest)
          return keyb[1] - keya[1];
      }
    );
  }

0

Это лучшее решение. Я думаю так.

Object.keys(obj).map(function(k){return {key: k, value: obj[k]}})

0
      var data = [];

      data  = {{ jdata|safe }}; //parse through js
      var i = 0 ;
      for (i=0;i<data.length;i++){
         data[i] = data[i].value;
      }

2
Спасибо за этот фрагмент кода, который может предоставить некоторую ограниченную, немедленную помощь. Надлежащее объяснение было бы значительно улучшить свою долгосрочную ценность , показывая , почему это хорошее решение проблемы, и сделает его более полезным для читателей будущих с другими подобными вопросами. Пожалуйста, измените свой ответ, чтобы добавить некоторые объяснения, в том числе предположения, которые вы сделали.
Могсдад

0

Вы можете конвертировать json Object в Array & String, используя PHP.

$data='{"resultList":[{"id":"1839","displayName":"Analytics","subLine":""},{"id":"1015","displayName":"Automation","subLine":""},{"id":"1084","displayName":"Aviation","subLine":""},{"id":"554","displayName":"Apparel","subLine":""},{"id":"875","displayName":"Aerospace","subLine":""},{"id":"1990","displayName":"Account Reconciliation","subLine":""},{"id":"3657","displayName":"Android","subLine":""},{"id":"1262","displayName":"Apache","subLine":""},{"id":"1440","displayName":"Acting","subLine":""},{"id":"710","displayName":"Aircraft","subLine":""},{"id":"12187","displayName":"AAC","subLine":""}, {"id":"20365","displayName":"AAT","subLine":""}, {"id":"7849","displayName":"AAP","subLine":""}, {"id":"20511","displayName":"AACR2","subLine":""}, {"id":"28585","displayName":"AASHTO","subLine":""}, {"id":"45191","displayName":"AAMS","subLine":""}]}';

$b=json_decode($data);

$i=0;
while($b->{'resultList'}[$i])
{
    print_r($b->{'resultList'}[$i]->{'displayName'});
    echo "<br />";
    $i++;
}

Вопрос о JavaScript, а не PHP.
Чарльз Тейлор

-1

Вы можете использовать Object.assign()с пустым литералом массива []как target:

const input = {
  "0": "1",
  "1": "2",
  "2": "3",
  "3": "4"
}

const output = Object.assign([], input)

console.log(output)

Если вы проверяете polyfill , Object.assign(target, ...sources)просто копирует все перечисляемые собственные свойства из sourceобъектов в целевой объект. Если targetэто массив, он добавит числовые ключи к литералу массива и вернет этот targetобъект массива.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.