将带有数字键的 JavaScript 对象转换为数组
Posted
技术标签:
【中文标题】将带有数字键的 JavaScript 对象转换为数组【英文标题】:Converting JavaScript object with numeric keys into array 【发布时间】:2014-01-19 19:09:54 【问题描述】:我有一个像这样的对象作为来自服务器的 JSON 响应返回:
"0": "1",
"1": "2",
"2": "3",
"3": "4"
我想把它转换成这样的 javascript 数组:
["1","2","3","4"]
有没有最好的方法来做到这一点?无论我在哪里阅读,人们都在使用循环使用复杂的逻辑。那么有没有其他方法可以做到这一点?
【问题讨论】:
重复:***.com/questions/6857468/… 一个单纯的循环并不是复杂的逻辑,顺便说一句:)) 【参考方案1】: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]);
console.log(arr)
希望这就是你所追求的!
【讨论】:
谢谢。真的需要那个。有人在大量代码中使用一个对象作为数组,这很好,直到我需要在它之上构建...... 非常接近我需要的感谢:for(var x in data) arr[x] = data[x]; 【参考方案2】:这里没什么难的。循环遍历您的对象元素并将它们分配给数组
var obj = "0":"1","1":"2","2":"3","3":"4";
var arr = [];
for (elem in obj)
arr.push(obj[elem]);
http://jsfiddle.net/Qq2aM/
【讨论】:
【参考方案3】:var JsonObj =
"0": "1",
"1": "2",
"2": "3",
"3": "4"
;
var array = [];
for (var i in JsonObj)
if (JsonObj.hasOwnProperty(i) && !isNaN(+i))
array[+i] = JsonObj[i];
console.log(array)
DEMO
【讨论】:
【参考方案4】:没有什么能比得上“JSON 对象”——JSON 是一种序列化符号。
如果您想将您的 javascript 对象 转换为 javascript 数组,您可以编写自己的循环 [这不会那么复杂!],或者您依赖underscore.js_.toArray()
方法:
var obj = "0":"1","1":"2","2":"3","3":"4";
var yourArray = _(obj).toArray();
【讨论】:
谢谢 - 就像魅力一样。但是如何使它对内部对象也做同样的事情(对象中的对象)?内部对象也应该成为根级别数组的平面成员(以便可以将它们传递到 datatables.net 等) +1:“没有什么比得上“JSON 对象”——JSON 是一种序列化符号。” - 我不敢相信我必须听多少遍才能完全理解它。【参考方案5】:你只是这样做
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
【讨论】:
【参考方案6】:试试这个:
var newArr = [];
$.each(JSONObject.results.bindings, function(i, obj)
newArr.push([obj.value]);
);
【讨论】:
您的解决方案将是这里提出的所有解决方案中最慢的一个......对业务代码不利;)【参考方案7】:使用 jQuery 的 $.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);
【讨论】:
@adeneo 先生,您能否提供一些有关 htis 方法的解释。 @adeneo aka Mr.burns...感谢您的快速解决方案。 @NikhilAgrawal 这里的诀窍是使用 Object.keys(),它返回对象的键(= 它自己的可枚举属性)作为数组。然后我们可以使用 array.map 将每个键替换为新数组中对应的值。 这是一个答案,但不是很友好。 这个问题并不明确,但我假设对象的键本质上是数组的索引,它们是 (0,1,2,3)。只是指出人们应该知道这种方法不保证数组中的任何顺序;如果键是索引,那么您需要显式地对它们进行排序,以便以正确的顺序构建数组。【参考方案8】:假设您的值如下所示
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 编码的字符串时,除了我在此提到的方法之外,此页面上的其他方法似乎都不完全适合我。
【讨论】:
【参考方案9】:使用原始 javascript,假设您有:
var j = 0: "1", 1: "2", 2: "3", 3: "4";
您可以通过以下方式获取值:
Object.keys(j).map(function(_) return j[_]; )
输出:
["1", "2", "3", "4"]
【讨论】:
【参考方案10】:这是一个示例,说明如何获取对象数组和,然后对数组进行排序。
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];
);
【讨论】:
【参考方案11】:不确定我在这里缺少什么,但只需尝试以下代码即可。我在这里有什么遗漏吗?
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));
)
【讨论】:
【参考方案12】:这是最好的解决方案。我想是的。
Object.keys(obj).map(function(k)return key: k, value: obj[k])
【讨论】:
【参考方案13】: var data = [];
data = jdata|safe ; //parse through js
var i = 0 ;
for (i=0;i<data.length;i++)
data[i] = data[i].value;
【讨论】:
感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation would greatly improve its long-term value 通过展示为什么这是一个很好的解决问题的方法,并将使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。【参考方案14】: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
【讨论】:
【参考方案15】:您可以使用 PHP 将 json Object 转换为 Array & String。
$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。【参考方案16】:您可以将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
数组对象。
【讨论】:
【参考方案17】:公认的解决方案期望键从 0 开始并且是连续的 - 它将值放入数组中,但在途中会丢失索引。
如果您的“带有数字键的对象”不满足这些更严格的假设,请使用此选项。
//let sourceObject = ...
let destinationArray = [];
Object.keys(sourceObject).forEach(k => destinationArray[k] = sourceObject[k]);
【讨论】:
以上是关于将带有数字键的 JavaScript 对象转换为数组的主要内容,如果未能解决你的问题,请参考以下文章