我在 PHP 中有一个多维数组:
Array
(
[1] => Array
(
[19] => Array
(
[type] => 2
)
[6] => Array
(
[type] => 4
)
[12] => Array
(
[type] => 3
)
)
)
当我通过 javascript 对这个数组进行 json_encode 时:
var jsonArray = <?php echo json_encode($above_array); ?>;
我得到:
Object
(
[1] => Object
(
[6] => Object
(
[type] => 2
)
[12] => Object
(
[type] => 4
)
[19] => Object
(
[type] => 3
)
)
)
我想通过 id 保留第一个订单而不是第二个订单。
最佳答案
StackOverflow 上有一个问题 Does JavaScript Guarantee Object Property Order? 简而言之,答案是否定的,事实并非如此。因此,当将 PHP 数组转换为 Javascript 对象时,键顺序将不会保留。
PHP 和 Javascript 中数组的主要区别在于后者只能保存从零开始的连续整数键。所以并不总是可以将 PHP 数组转换为 Javascript 数组。 让我们看几个例子:
// example 1
echo json_encode(array(0 => 'a', 1 => 'b')) // outputs ["a","b"]
// example 2
echo json_encode(array(0 => 'a', 3 => 'b')) // outputs {"0":"a","3":"b"}
// example 3
echo json_encode(array(3 => 'b', 0 => 'a')) // outputs {"3":"b","0":"a"}, but in Javascript the key order will be the same as in example 2
json_encode 将 PHP 数组转换为相同的 Javascript 数组。 json_encode 函数没有保留键顺序,而是 Javascript 本身。回到我们的问题:如何将 PHP 数组传递给保留键顺序的 Javascript? 一种方法是将 PHP 键值对包装到数组中:
// original array:
array(
3 => 'b',
0 => 'a'
)
// must be converted to:
array(
array(3, 'b'),
array(0, 'a')
)
然后 json_encode 将产生以下 Javascript 数组:
[
[3,"b"],
[0,"a"]
]
最后一部分是在 Javascript 中遍历这样一个数组:
var php_encoded_array = [
[3,"b"],
[0,"a"]
];
for (var i=0; i < php_encoded_array.length; i++) {
var rec = php_encoded_array[i],
key = rec[0],
value = rec[1];
console.log(key + ': ' + value);
}
// It will output:
// 3: b
// 0: a
// Which is the exact same order as in the PHP array
这种方法也与非整数键兼容。
这是在 PHP 端转换数组的代码(由 pr1001 在类似问题中建议)。它适用于一维数组。
array_map(
function($key, $value) { return array($key, $value); },
array_keys($data),
array_values($data)
)
下面是多维数组的递归函数实现:
function array_preserve_js_order(array $data) {
return array_map(
function($key, $value) {
if (is_array($value)) {
$value = array_preserve_js_order($value);
}
return array($key, $value);
},
array_keys($data),
array_values($data)
);
}
关于javascript - json_encode 不保留顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20912492/
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul
我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":
我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("
RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我正在构建一个小部件来显示奥运会的奖牌数。我有一个“国家”对象的集合,其中每个对象都有一个“名称”属性,以及奖牌计数的“金”、“银”、“铜”。列表应该排序:1.首先是奖牌总数2.如果奖牌相同,按类型分割(金>银>铜,即2金>1金+1银)3.如果奖牌和类型相同,则按字母顺序子排序我正在用ruby做这件事,但我想语言并不重要。我确实找到了一个解决方案,但如果感觉必须有更优雅的方法来实现它。这是我做的:使用加权奖牌总数创建一个虚拟属性。因此,如果他们有2个金牌和1个银牌,加权总数将为“3.020100”。1金1银1铜为“3.010101”由于我们希望将奖牌数排序为最高的,因此列表按降序排
我在一个简单的RailsAPI中有以下Controller代码:classApi::V1::AccountsControllerehead:not_foundendendend问题在于,生成的json具有以下格式:{id:2,name:'Simpleaccount',cash_flows:[{id:1,amount:34.3,description:'simpledescription'},{id:2,amount:1.12,description:'otherdescription'}]}我需要我生成的json是camelCase('cashFlows'而不是'cash_flows'
我正在学习如何使用JSONgem解析和生成JSON。我可以轻松地创建数据哈希并将其生成为JSON;但是,在获取一个类的实例(例如Person实例)并将其所有实例变量放入哈希中以转换为JSON时,我脑袋放屁。这是我遇到问题的例子:require"json"classPersondefinitialize(name,age,address)@name=name@age=age@address=addressenddefto_jsonendendp=Person.new('JohnDoe',46,"123ElmStreet")p.to_json我想创建一个.to_json方法,这样我就可以获
我正在构建一个带有Rails后端的JS应用程序,为了不混淆snake和camelcases,我想通过从服务器返回camelcase键名来规范化这一切。因此,当从API返回时,user.last_name将返回user.lastName。我如何实现这一点?谢谢!编辑:添加Controller代码classApi::V1::UsersController 最佳答案 我的方法是使用ActiveModelSerializer和json_api适配器:在你的Gemfile中,添加:gem'active_model_serializers'创建