2016-06-20 39 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);

相關問題