将javascript数组元素与同一数组中的其他元素进行比较。如果元素是相同的意思,我必须为所有共同元素给出相同的数字。如果元素不同,我必须为另一个元素中的所有非相同元素提供一些不同的数字。
例如:
Array structure = [{Location, Date, Number}]
array = [{ 'LA','2017-12-01',1},
{ 'LA','2017-12-01',1},
{ 'NY','2017-12-01',2},
{ 'NY','2016-10-01',3},
{ 'LA','2017-12-01',1},
{ 'LA','2017-12-01',1},
{ 'LA','2017-12-01',1}]
在这个数组'数字'是动态元素,应该填充以下规则。
`key1 = location + '-' +date;`
考虑Key1是第一个元素(位置+日期的组合)。如果阵列中存在相同的key1,那么' Number'对于所有相同的Key1都是通用的。
在上面的示例{'LA','2017-12-01',1 }
中,编号为1。
{ 'NY','2017-12-01',2}
的数字为2.和{ 'NY','2016-10-01',3}
,数字为3,因为虽然位置很常见,但日期不同。
请在下面找到我正在尝试的代码。但它为所有数组元素赋予相同的数字。
JSONObject orderObj=database.getOrder(salesorderId);
JSONArray lineArr = orderObj.getJSONArray("order_items"); //lines
JSONObject lineObj = null;
for(int i=0;i<lineArr.length();i++)
{
lineObj = lineArr.getJSONObject(i);
String source_location=lineObj.getString("source_location");
String key=source_location.concat(lineObj.has("ship_date") ?
lineObj.getString("ship_date") : lineObj.getString("req_ship_date"));
Map map=new HashMap();
if(!map.containsKey(key)){
map.put(key, map.size()+1);
}
lineObj.put("number", map.get(key).toString());
}
orderObj.append("order_items", lineObj);
答案 0 :(得分:0)
将map
的实例化移出for
循环:
JSONObject orderObj = database.getOrder(salesorderId);
JSONArray lineArr = orderObj.getJSONArray("order_items"); //lines
JSONObject lineObj = null;
// To here:
Map map = new HashMap();
for ( int i = 0; i < lineArr.length(); ++i )
{
lineObj = lineArr.getJSONObject(i);
String source_location = lineObj.getString("source_location");
String key = source_location.concat( lineObj.has("ship_date") ?
lineObj.getString("ship_date") : lineObj.getString("req_ship_date"));
// From here: Map map=new HashMap();
if ( !map.containsKey(key) )
{
map.put(key, map.size() + 1);
}
lineObj.put("number", map.get(key).toString());
}
orderObj.append("order_items", lineObj);