我有一個陣列,它有兩個值一個日期和一個金額,但是在不同的索引處有相同的日期和不同的值,所以我需要將這些值合并到多維 javascript 陣列中的相同日期
當前陣列
var arry = [
['2021-05-01',100],
['2021-05-02',300],
['2021-05-03',200],
['2021-05-01',150],
['2021-05-02',300],
['2021-05-01',600],
['2021-05-04',120]
]
預期結果陣列
var arry = [
['2021-05-01',850],
['2021-05-02',600],
['2021-05-03',200],
['2021-05-04',120]]
有人可以幫忙嗎?我非常感謝您能提供的任何幫助。
uj5u.com熱心網友回復:
您可以使用reduce方法:
var arry = [
['2021-05-01',100],
['2021-05-02',300],
['2021-05-03',200],
['2021-05-01',150],
['2021-05-02',300],
['2021-05-01',600],
['2021-05-04',120]
];
const data = arry.reduce((list, [date, value]) => {
list[date] = (list[date] ?? 0) value;
return list;
}, {});
const list = Object.entries(data); // if you want the array
console.log(list);
uj5u.com熱心網友回復:
這是一個使用reduce. 我正在創建一個按日期分組的物件并獲取它的值陣列
var arry = [['2021-05-01',100], ['2021-05-02',300], ['2021-05-03',200], ['2021-05-01',150],['2021-05-02',300], ['2021-05-01',600],['2021-05-04',120]]
const res = Object.values(arry.reduce((acc,[date,val])=> {
acc[date] = acc[date] || [date,0]
acc[date][1] =val
return acc
},{}))
console.log(res)
uj5u.com熱心網友回復:
您可能只是回圈遍歷串列,并在串列中的每個值處檢查之前出現的所有值,看看它是否是重復的。像下面這樣的東西會起作用:
var array = [
['2021-05-01',100],
['2021-05-02',300],
['2021-05-03',200],
['2021-05-01',150],
['2021-05-02',300],
['2021-05-01',600],
['2021-05-04',120]
]
var newArray = []; // where we will put the new merged values
for (var lookAtOldArray = 0; lookAtOldArray < array.length; lookAtOldArray ) {
// check all previous values in newArray up to this point:
var checkNewArray; // declare out here for logic post loop
for (checkNewArray = 0; checkNewArray < newArray.length; checkNewArray ) {
if (array[lookAtOldArray][0] == newArray[checkNewArray][0]) {
// add to newArray number:
newArray[checkNewArray][1] = array[lookAtOldArray][1];
break; // BREAK to signify we found a position
}
// otherwise keep looking
}
// because of the break, if checkNewArray == newArray.length, then we DID NOT find a duplicate (AKA: push to newArray with exact value in array)
if (checkNewArray == newArray.length) {
newArray.push(array[lookAtOldArray]);
}
}
另一個有趣的想法是使用物件。上述策略需要比必要的更多次查看資料(最壞情況下為 n^2)。對于物件,您可以將日期用作鍵,將數字用作值。有了這個,你可以做這樣的事情(假設相同的宣告array:
var combinedDates = {};
for (var lookAtOldArray = 0; lookAtOldArray < array.length; lookAtOldArray ) {
combinedDates[array[lookAtOldArray][0]] = array[lookAtOldArray[1];
}
你可以說這更快更簡單。生成的物件將如下所示:
{
"2021-05-01": 850,
"2021-05-02": 600,
"2021-05-03": 200,
"2021-05-04": 120
}
由于效率提高,我優先選擇第二個;您只需查看初始陣列中的每個元素一次(導致n時間復雜度或線性時間復雜度)!
如果要將上述物件組合回陣列中,則可以執行以下操作:
// get object keys
var objectKeys = Object.keys(combinedDates);
var newArray = [];
// loop through keys
for (var makeObject = 0; makeObject < objectKeys.length; makeObject ) {
// create array with key (the date) and the number (the value stored at the key):
newArray.push([objectKeys[makeObject][0], combinedDates[objectKeys[makeObject]]);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477184.html
標籤:javascript 数组 json
上一篇:決議嵌套的JSON物件
