2016-06-20 6 views
-1

У меня есть один массив json и другой массив для порядка сортировки. Теперь я хочу отсортировать массив json в соответствии с элементами массива сортировки.Сортировка данных json на основе другого массива

var checkedIds =["2","1","4"];//sort order array 

    //json array 
    var jsonData1= { 
     "ProductImages": [ 
        { "checkBoxField": false, "itemId": 1, "rateValue":"$34" }, 
        { "checkBoxField": false, "itemId": 2, "rateValue":"$34" }, 
        { "checkBoxField": false, "itemId": 3, "rateValue":"$34" }, 
        { "checkBoxField": false, "itemId": 4, "rateValue":"$34" }, 
        { "checkBoxField": false, "itemId": 5, "rateValue":"$34" }, 
        { "checkBoxField": false, "itemId": 6, "rateValue":"$34" }, 
        { "checkBoxField": false, "itemId": 7, "rateValue":"$34" }, 
        { "checkBoxField": false, "itemId": 8,"rateValue":"$34" } 
     ] 
    }; 

Выхода Должен быть

var jsonData1= { 
     "ProductImages": [ 
        { "checkBoxField": true, "itemId": 2, "rateValue":"$34" }, 
        { "checkBoxField": true, "itemId": 1, "rateValue":"$34" }, 
        { "checkBoxField": true, "itemId": 4, "rateValue":"$34" }, 
        { "checkBoxField": false, "itemId": 3, "rateValue":"$34" }, 
        { "checkBoxField": false, "itemId": 5, "rateValue":"$34" }, 
        { "checkBoxField": false, "itemId": 6, "rateValue":"$34" }, 
        { "checkBoxField": false, "itemId": 7, "rateValue":"$34" }, 
        { "checkBoxField": false, "itemId": 8,"rateValue":"$34" } 
     ] 
    }; 
+0

Вы пробовали что-нибудь? Кроме того, почему вы сохраняете числа в виде строк в 'checkedIds'? – 4castle

+0

Что вы пробовали? Как следует сортировать элементы, которые не являются частью массива 'checkedIds'? – Timo

+0

Я думаю, что есть лучший способ решить то, что вы пытаетесь сделать, чем делать это. См. [Что такое проблема XY?] (Http://meta.stackexchange.com/a/66378). Почему бы вам не сделать «ProductImages» вместо объекта и сделать ключ «itemId»? Вы можете использовать 'checkedIds' для ссылки на ключи, когда они вам понадобятся. – 4castle

ответ

-1

Кажется, что вы хотите, своего рода selection sort с тем отличием, что вместо того, чтобы искать минимальное значение, вы выглядите для следующего значения в списке.

1

Вы можете использовать хеш-таблицу для заказа и значения по умолчанию, достаточно большие, чтобы переместить значения не по приоритетам до конца.

var checkedIds = ["2", "1", "4"], 
 
    jsonData1 = { "ProductImages": [{ "checkBoxField": false, "itemId": 1, "rateValue": "$34" }, { "checkBoxField": false, "itemId": 2, "rateValue": "$34" }, { "checkBoxField": false, "itemId": 3, "rateValue": "$34" }, { "checkBoxField": false, "itemId": 4, "rateValue": "$34" }, { "checkBoxField": false, "itemId": 5, "rateValue": "$34" }, { "checkBoxField": false, "itemId": 6, "rateValue": "$34" }, { "checkBoxField": false, "itemId": 7, "rateValue": "$34" }, { "checkBoxField": false, "itemId": 8, "rateValue": "$34" }] }; 
 

 
jsonData1.ProductImages.sort(function (hash) { 
 
    checkedIds.forEach(function (a, i) { 
 
     hash[a] = i + 1; 
 
    }); 
 
    return function (a, b) { 
 
     return (hash[a.itemId] || Infinity) - (hash[b.itemId] || Infinity); 
 
    }; 
 
}(Object.create(null))); 
 

 
console.log(jsonData1);

версия с обновлением checkBoxField и короткого замыкания.

var checkedIds = ["2", "1", "4"], 
 
    jsonData1 = { "ProductImages": [{ "checkBoxField": false, "itemId": 1, "rateValue": "$34" }, { "checkBoxField": false, "itemId": 2, "rateValue": "$34" }, { "checkBoxField": false, "itemId": 3, "rateValue": "$34" }, { "checkBoxField": false, "itemId": 4, "rateValue": "$34" }, { "checkBoxField": false, "itemId": 5, "rateValue": "$34" }, { "checkBoxField": false, "itemId": 6, "rateValue": "$34" }, { "checkBoxField": false, "itemId": 7, "rateValue": "$34" }, { "checkBoxField": false, "itemId": 8, "rateValue": "$34" }] }, 
 
    hash = Object.create(null); 
 

 
checkedIds.forEach(function (a, i) { 
 
    hash[a] = i + 1; 
 
}); 
 

 
jsonData1.ProductImages.some(function (a, i) { 
 
    if (a.itemId in hash) { 
 
     a.checkBoxField = true; 
 
     return !--this.count; 
 
    } 
 
}, { count: checkedIds.length }); 
 

 
jsonData1.ProductImages.sort(function (a, b) { 
 
    return (hash[a.itemId] || Infinity) - (hash[b.itemId] || Infinity); 
 
}); 
 

 
console.log(jsonData1);

1

Вы можете иметь пользовательские сортировки на основе вычисленной ранга:

JSFiddle.

var checkedIds = ["2", "1", "4"]; //sort order array 
 

 
//json array 
 
var jsonData1={ProductImages:[{checkBoxField:!1,itemId:1,rateValue:"$34"},{checkBoxField:!1,itemId:2,rateValue:"$34"},{checkBoxField:!1,itemId:3,rateValue:"$34"},{checkBoxField:!1,itemId:4,rateValue:"$34"},{checkBoxField:!1,itemId:5,rateValue:"$34"},{checkBoxField:!1,itemId:6,rateValue:"$34"},{checkBoxField:!1,itemId:7,rateValue:"$34"},{checkBoxField:!1,itemId:8,rateValue:"$34"}]}; 
 

 
function getRank(item){ 
 
    var index = checkedIds.indexOf(item.itemId.toString()); 
 
    var rank = 1; 
 
    if (index>-1){ 
 
    rank *= (checkedIds.length - index) * -1; 
 
    } 
 
    return rank; 
 
} 
 

 
jsonData1.ProductImages.sort(function(a,b){ 
 
    var r1 = getRank(a); 
 
    var r2 = getRank(b); 
 
    return r1>r2 ? 1 : r1<r2 ?-1: 0; 
 
}) 
 

 
document.getElementById("result").innerHTML = JSON.stringify(jsonData1.ProductImages.map(function(a){return a.itemId}));
<pre id="result"></pre>

+0

Умное решение! –

1

Идея заключается в том, чтобы написать собственную функцию сравнения для функции сортировки в JS: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

В этой функции сравнения вы можете также установить значение "checkBoxField" непосредственно. (Может быть, не самый эффективный способ)

Это пример для вашей проблемы:

var checkedIds =[2,1,4];//sort order array 

    //json array 
var jsonData1= { 
    "ProductImages": [ 
    { "checkBoxField": false, "itemId": 1, "rateValue":"$34" }, 
    { "checkBoxField": false, "itemId": 2, "rateValue":"$34" }, 
    { "checkBoxField": false, "itemId": 3, "rateValue":"$34" }, 
    { "checkBoxField": false, "itemId": 4, "rateValue":"$34" }, 
    { "checkBoxField": false, "itemId": 5, "rateValue":"$34" }, 
    { "checkBoxField": false, "itemId": 6, "rateValue":"$34" }, 
    { "checkBoxField": false, "itemId": 7, "rateValue":"$34" }, 
    { "checkBoxField": false, "itemId": 8,"rateValue":"$34" } 
    ] 
}; 

var arr = jsonData1["ProductImages"] 
arr.sort(function compare(a, b) { 
    if (checkedIds.indexOf(a["itemId"]) >= 0) { 
    a["checkBoxField"] = true; 
    } 
    if (checkedIds.indexOf(b["itemId"]) >= 0) { 
    b["checkBoxField"] = true; 
    } 
    if (checkedIds.indexOf(a["itemId"]) >= 0 && checkedIds.indexOf(b["itemId"]) < 0) { 
     return -1; 
    } 
    if (checkedIds.indexOf(b["itemId"]) >= 0 && checkedIds.indexOf(a["itemId"]) < 0) { 
     return 1; 
    } 
    return checkedIds.indexOf(a["itemId"])-checkedIds.indexOf(b["itemId"]); 
}); 

console.log(arr); 

Как уже упоминалось в одном из комментариев следует использовать целые числа в вашем checkedIds массиве.

https://jsfiddle.net/yxq0xL6L/1/

0

Вот скучный, не умный, но легкий для понимания итеративный решение:

var sortMe = function(ids, data) { 
 
    var i,j,ret = []; 
 

 
    // first get the items with matched ids: 
 
    for (i=0; i<ids.length;i++) { 
 
    for (j=0; j<data.length; j++) { 
 
     if (data[j].itemId == ids[i]) { 
 
     ret.push(data[j]); 
 
     } 
 
    } 
 
    } 
 
    // now get everything else (in its original order): 
 
    for (i=0; i<data.length; i++) { 
 
    // note: ids[] contains strings, so need to add "" to each data.itemId: 
 
    if (ids.indexOf(data[i].itemId+"") == -1) { 
 
     ret.push(data[i]); 
 
    } 
 
    } 
 
    return ret; 
 
}; 
 

 
var checkedIds = ["2", "1", "4"]; //sort order array 
 
var jsonData1 = { 
 
    "ProductImages": [{ 
 
    "checkBoxField": false, 
 
    "itemId": 1, 
 
    "rateValue": "$34" 
 
    }, { 
 
    "checkBoxField": false, 
 
    "itemId": 2, 
 
    "rateValue": "$34" 
 
    }, { 
 
    "checkBoxField": false, 
 
    "itemId": 3, 
 
    "rateValue": "$34" 
 
    }, { 
 
    "checkBoxField": false, 
 
    "itemId": 4, 
 
    "rateValue": "$34" 
 
    }, { 
 
    "checkBoxField": false, 
 
    "itemId": 5, 
 
    "rateValue": "$34" 
 
    }, { 
 
    "checkBoxField": false, 
 
    "itemId": 6, 
 
    "rateValue": "$34" 
 
    }, { 
 
    "checkBoxField": false, 
 
    "itemId": 7, 
 
    "rateValue": "$34" 
 
    }, { 
 
    "checkBoxField": false, 
 
    "itemId": 8, 
 
    "rateValue": "$34" 
 
    }] 
 
}; 
 

 
var foo = sortMe(checkedIds, jsonData1.ProductImages); 
 
console.log(foo);

Смежные вопросы