Chrome 및 Opera에서 인덱스 ASC별로 JSON 개체를 정렬하는 것을 중지하려면 어떻게 해야 합니까?
내게 문제가 있어요.
ajax를 사용하여 다음 명령을 사용하여 올바른 형식의 JSON 개체를 보냈습니다.
$.ajax({
type: "POST",
url: SITE_URL+'/data.php',
dataType: "json",
data: { ajax: 1 },
success: function(data) {
console.log(data);
}
});
하지만 Opera와 Chrome은 같은 오브젝트를 받아도 잘못된 순서로 출력하기 때문에 둘 다 그대로 두지 않고 ID 번호로 정렬을 하는 것 같습니다!
이 자동 정렬을 멈출 수 있는 방법이 있나요?
편집, 인덱스 번호에 의한 정렬임을 알게 된 후 object_id 저장에 인덱스를 사용하지 않고 오브젝트를 주문하고 싶은 ID 번호를 저장하는 것이 가장 좋은 방법이라고 생각합니다.
그러나 나는 여전히 그것을 막을 방법이 있는지 알고 싶다.
감사해요.
Edit 2, 이 방법에서는 오브젝트를 남용하고 있는 것 같기 때문에, 다른 방법으로 작업하는 것에 주의해 주세요.그러나 Opera와 Chrome이 개체 ID의 순서를 변경할 권리가 있다고 생각하는 이유를 알고 싶습니다.
문제는 제가 처리 능력을 절약하려고 하는 것입니다. 예를 들어, ID를 가진 사람들이 있다고 가정해 봅시다.
1. 존, 2.프랭크와 3번.샐리, 하지만 이 사람들은 각각 높은 재산(그리고 다른 것)을 가지고 있다.1. John.180, 2.프랭크.220, 3.샐리.150.처리 비용을 절약하기 위해 키별로 결과를 정렬하여 2, 1, 3의 배열을 다른 속성과 함께 얻도록 요청합니다.이 어레이를 JSON하여 브라우저로 전송합니다.
이제 FF는 새로운 순서를 유지합니다.People [ 1 ]는 여전히 John이지만 For n as person 루프에서는 순서가 맞지 않습니다.
이 문제를 해결할 수 없다면 SQL 단계에서 정렬하지 않고 JS 단계에서 추가 루프와 정렬을 추가하여 JS 단계에서 어레이에 정렬하면 됩니다.단, 이미 JS의 페이지가 무거워지기 때문에 브라우저에 대한 부하를 줄이고 싶었습니다.
대단히 고맙습니다
같은 문제가 발생하여 dmc의 솔루션을 따라갔지만 int 값 앞에 공백을 추가하여 문자열로 만들었습니다.
숫자 이외의 다른 문자보다 공백을 사용하는 장점은 후속 POSTed 값을 다시 제거할 필요 없이 mySQL 검색 절에서 직접 사용할 수 있다는 것입니다.
브라우저마다 오브젝트를 처리하는 방법이 달라서 오브젝트를 빌드한 순서를 참조로 사용하지 않는 것이 실수였습니다.
정수를 문자열로 변경해도 문제가 없습니다(Chrome, jQuery 1.7.1).질서를 유지하기 위해(네, 객체 남용입니다) 다음을 변경했습니다.
optionValues0 = {"4321": "option 1", "1234": "option 2"};
여기에
optionValues0 = {"1": {id: "4321", value: "option 1"}, "2": {id: "1234", value: "option 2"}};
JSON이 객체가 아닌 배열이 아닌 경우 특정 순서로 정렬되어야 한다는 표준은 없습니다.그러나 데이터를 얻기 위해 개체를 반복할 필요가 없기 때문에 이것은 문제가 되지 않습니다. 단지 속성을 참조할 수 있습니다.
일부 브라우저는 int의 키를 정렬하지만, 그것을 문자열로 변경하고 나중에 되돌리는 것은 매우 쉽습니다.나의 해결책은 키에 "i"를 추가하여 트릭을 만드는 것이었습니다.각 브라우저에 대해 완벽하게 동작합니다. :) Hope that help:)
저도 같은 '문제'가 있어서 다시 돌아가서 코드를 너무 많이 바꾸고 싶지 않았습니다.적어도 Google Chrome은 숫자 인덱스만 재배치한다는 것을 알게 되었습니다.인덱스가 문자열로 간주되는 한 인덱스는 "의도된" 순서로 표시됩니다.누가 오페라에서 이걸 확인해 줄 수 있나요?
어떤 솔루션도 효과가 없었습니다(2017년 8월).스트링을 사용해도 Chrome과 Safari(다른 브라우저는 테스트하지 않음)는 스트링을 기준으로 정렬되어 있었습니다.대신 정수 키를 값 문자열과 연결했습니다.
result[string_value + str(integer_key)] = string_value
이렇게 하면 문자열이 처음이고 브라우저는 자유롭게 정렬할 수 있습니다.그런 다음 간단한 논리를 사용하여 키와 값을 구분했습니다.
이게 도움이 됐으면 좋겠다.
크롬도 같은 문제가 있어서 답답했어요.제가 보내는 방법이 있는데 왜 크롬은 제 말을 그대로 받아들이지 못하는 거죠?'표준'이라는 게 없다는 건 알지만, 그렇다면 왜 당신만의 주문을 하겠습니까?
어쨌든 오브젝트를 어레이로 변환하여 처리했습니다.그래서
{ 0: "", 2: "Frame", 1: "Masonry" }
되었다
[[ 0, "" ], [ 2, "Frame" ], [ 1, "Masonry" ]]
Javascript를 바꿔야 했지만, 결국 완벽하게 작동했어요.
연관지을 수 있는 어레이는 피하는 것이 가장 좋은 방법인 것 같습니다.어소시에이트 어레이를 송신하는 경우는, 키와 값의 2개의 어레이로 송신하기만 하면 됩니다.이를 위한 PHP 코드는 다음과 같습니다.
$arWrapper = array();
$arWrapper['k'] = array_keys($arChoices);
$arWrapper['v'] = array_values($arChoices);
$json = json_encode($arWrapper);
간단한 JavaScript 코드를 사용하여 원하는 작업을 수행할 수 있습니다.
for (i=0; i < data['k'].length; i++) {
console.log('key:' + data['k'][i] + ' val:' + data['v'][i]);
}
비슷한 문제가 있어서 jQuery에 글을 올렸습니다: $.getJChrome/IE에서 데이터를 정렬하는 SON?
다음 코드를 사용하여 이 문제를 해결했습니다.
$('.edit_district').editable("/moderator/sale/edit_sale/", {
data : " {'_7':'10 street', '_9':'9 street', '_11':'park'}",
type : 'select',
submit : 'OK',
onblur : 'submit'
});
그리고 대본으로.php:
...
case "id_district":
$district = Districts::GetDistrictByID(Database::getInstance(), (int)substr($value,1));
if($district instanceof District){
$data["id_district"] = $district->id_district;
echo $district->title;
}
break;
...
Google Chrome(및 기타)를 속여서 숫자가 아닌 문자열이 있다고 생각하게 해야 합니다.JSON을 로 변경하다{"2423":'abc', "2555":'xyz'}동작하지 않습니다.
오브젝트가 동작하기 위해서는 오브젝트의 인덱스로 _2423과 _2555를 사용해야 했습니다.
또한 console.log 출력 디버깅 또는for x in y에 대해 다른 결과를 주었다_.eachmethod (밑줄 프레임워크 참조)
JSFiddle에서 제 테스트/프루프를 보실 수 있습니다."_"vs 프리픽스 없음 및for x in y루프: http://jsfiddle.net/3f9jugtg/1/
오브젝트 ID를 JSON 문자열 파라미터로 설정합니다.이 파라미터는 자동 정렬 없이 동작합니다.
레코드 ID를 사용하여 포스트 프로세스루프 내의 오브젝트를 그룹화할 필요가 있는 경우가 있습니다.키 값 주위에 따옴표를 붙이면 됩니다.또는 키를 리셋하는 최종 배열에서 array_merge를 사용할 수도 있습니다.
$processed_array = array(
235=>array("id"=>235,"name"=>"Something"),
27=>array("id"=>27,"name"=>"Something")
);
array_merge($processed_array);
print_r($processed_array)입니다.이 시점에서 다음 항목이 반환됩니다.
$processed_array = array(
0=>array("id"=>235,"name"=>"Something"),
1=>array("id"=>27,"name"=>"Something")
);
저도 같은 문제가 있어서 원인이 무엇인지 알아내는 데 시간이 좀 걸렸어요. 정말 괴로웠어요.인덱스에서 ID를 삭제하고 array_push를 사용했습니다.
$section[$s_id]['Type'] = $booktype;
etc. 로 변경했습니다.
array_push($sections, array('ID'=>$s_id,
'CourseID'=>$courseid,
'SectionName'=>$secname,
'Order'=>$order,
'Created'=>$created,
'Description'=>$desc
));
새로운 인덱스가 이미 정렬되어 있기 때문에 PHP로부터의 오더를 유지할 수 있었습니다(112, 56, 411 등과는 반대로 0, 1, 2, 3 등).
도움이 될 수 있는 한 가지 방법은 다음과 같습니다.
루프를 위해 데이터를 준비하는 동안 키에 "i"를 추가해야 합니다. 이것이 트릭이 되었습니다.각 브라우저에서 완벽하게 작동합니다.
예:
for(var i=1;i<4;i++){
data[''+i+''+your_random_generatedId+''] = {"questionText":"","answer":"","options":"",noOfOptions:""};
console.log(data[''+i+''+your_random_generatedId+'']); // This prints the log of each object inside data
}
console.log(data); // This will print the Object without sorting
따라서 오브젝트는 다음과 같습니다.
Object {156674: Object, 201705: Object, 329709: Object}
이것이 도움이 되기를 바란다:)
다른 지역을 추가했을 때도 같은 문제가 있었습니다만, 특정의 방법으로 분류할 필요가 있었습니다.데이터베이스 테이블에 "sort" 필드를 추가했는데 선택에서 예상대로 정렬했습니다.원시 JSON은 예상대로였는데 AJAX를 통해 데이터를 입력한 선택 필드에서 키(region_id)를 기준으로 정렬되었습니까?문제는 region_id가 정수라는 것입니다.그 대신 키를 캡슐화하여 문자열로 만들었습니다.
while($row = $result->fetch_array()) {
$this->regions["'".$row['region_id']."'"] = $row['region'];
}
이전 코드는 다음과 같습니다.
while($row = $result->fetch_array()) {
$this->regions[$row['region_id']] = $row['region'];
}
키에 모든 문자를 추가하는 것보다 훨씬 우아해. 그냥 다른 끝으로 바꾸는 것 뿐이지.
다른 사람이 더 깨끗한 코드를 얻는 데 도움이 되었으면 합니다. :-)
php에서는 다음과 같은 구조로 응답을 받았습니다.
{
"12198882": {
"orderId": "12198882",
"orderDate": "2021-10-25 15:40:40",
"total": "167.91",
"currency": "EUR"
},
"12198824": {
"orderId": "12198824",
"orderDate": "2021-10-25 15:35:30",
"total": "110.00",
"currency": "EUR"
}
}
그리고 Michail의 답변을 따름으로써 우리는 대신 이 새로운 구조로 답변을 줄 수 있었습니다.
[
{
"orderId": "12198882",
"orderDate": "2021-10-25 15:40:40",
"total": "167.91",
"currency": "EUR"
},
{
"orderId": "12198824",
"orderDate": "2021-10-25 15:35:30",
"total": "110.00",
"currency": "EUR"
}
]
전화만 .array_flatten()이전 응답 값에 대해 다음과 같이 입력합니다.
array_flatten($service->getOrders())
그리고 이것으로 문제가 해결되었다.
를 '''로 때'console.log으로 JavaScript를 합니다.toString()메서드를 지정합니다.에 들지 않기 toString()을 사용하다
이러한 유형의 제어를 원하는 경우 개체의 필드를 직접 덤프할 수 있습니다. 키/필드를 가져와 정렬한 다음 문자열 버전을 직접 작성해야 합니다.
예를 들어 다음과 같습니다.
for (field in obj)
add field to array
sort array into whatever order you want
for (field in array)
get value of field from obj
create string of field : value, append to main string
console.log(main string)
언급URL : https://stackoverflow.com/questions/5020699/how-do-you-stop-chrome-and-opera-sorting-json-objects-by-index-asc
'programing' 카테고리의 다른 글
| '시작' 시 tsconfig.json이 덮어쓰지 않도록 react-script를 구성하는 방법 (0) | 2023.03.09 |
|---|---|
| 폼을 초기 상태로 리셋(AngularJS 1.0.x) (0) | 2023.03.09 |
| Angularjs:단일 html에 여러 부분 포함? (0) | 2023.03.09 |
| AngularJ: ng-switch(OR이 있는 경우) (0) | 2023.03.09 |
| React/MUI Autocomplete 컴포넌트에 고유 키를 추가하려면 어떻게 해야 합니까? (0) | 2023.03.09 |