Перетворення об’єкта JavaScript за допомогою цифрових клавіш у масив


175

У мене такий об'єкт повертається як відповідь JSON від сервера:

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

Я хочу перетворити його в масив JavaScript так:

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

Чи є найкращий спосіб це зробити? Де б я не читав, люди використовують складну логіку, використовуючи петлі. Чи існують альтернативні методи для цього?



8
Проста петля - це не складна логіка , до речі
:)

Відповіді:


328

Це насправді дуже прямо вперед з jQuery $.map

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

ПІДМОГА

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

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

ПІДМОГА

Це припускаючи, що він вже проаналізований як об’єкт javascript, а насправді не JSON, який є строковим форматом, і в цьому випадку необхідний також пробіг JSON.parse.

У ES2015 Object.valuesна допомогу, що робить це легким вітром

var arr = Object.values(obj);

1
@adeneo Сер, чи можете ви надати пояснення щодо методів htis.
Nikhil Agrawal

1
@adeneo ака містер спалює ... Дякую за це швидке рішення.
Dzeimsas Zvirblis

1
@NikhilAgrawal Хитрість тут полягає у використанні Object.keys (), який повертає ключі об'єкта (= його власні перелічені властивості) як масив . Тоді ми можемо використовувати array.map для заміни кожного ключа відповідним значенням у новому масиві.
антоїн

1
Це відповідь, але не дуже привітна.
sheriffderek

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]);
}

Сподіваюсь, що це те, що ти хочеш


Дякую. справді це було потрібно. хтось використовував об’єкт як масив протягом усієї тонни коду, що було добре, поки мені не потрібно було будувати поверх нього ...
amanda fours

Дякую! Ідеальна відповідь.
Вінсент

дуже близький до того, що мені потрібно було подякувати: за (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

Припустимо, використовуючи необроблений 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 в масив та рядок за допомогою 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)

Якщо ви перевіряєте полізаповнення , Object.assign(target, ...sources)просто скопіюйте всі перелічені власні властивості з sourceоб'єктів на цільовий об’єкт. Якщо targetмасив - це масив, він додасть числові ключі до літералу масиву і поверне цей targetмасив об'єкта.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.