Перетворення об’єкта 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.