单击按钮后,fruitData数组中的数据将添加到另一个称为历史记录的数组中。 我希望历史记录中的属性“ bins”在属性“ kultivar”,“ blokNommer”和“ year”与从fruitData添加的对象匹配时进行更新。 (如果有匹配项,则必须将bins属性中的数字加在一起)
例如:
[
{datum: "2020-04-08", kultivar: "bc", ha: "5", blokNommer: "1", bins: "20", year: "2020"},
{datum: "2020-04-08", kultivar: "bc", ha: "5", blokNommer: "1", bins: "20", year: "2020"}
]
应等于此值(bins:40):
[
{datum: "2020-04-08", kultivar: "bc", ha: "5", blokNommer: "1", bins: "40", year: "2020"}
]
我的代码:
let fruitData = [{
datum: "2020-04-08",
kultivar: "bc",
ha: "5",
blokNommer: "1",
bins: "20",
year: "2020"
},
{
datum: "2020-09-18",
kultivar: "wb",
ha: "5",
blokNommer: "1",
bins: "5",
year: "2020"
},
{
datum: "2020-03-09",
kultivar: "bc",
ha: "5",
blokNommer: "1",
bins: "20",
year: "2020"
},
{
datum: "2020-04-08",
kultivar: "bc",
ha: "5",
blokNommer: "1",
bins: "20",
year: "2020"
}
]
historyButton.addEventListener('click', () => {
addToHistory(fruitData)
})
function addToHistory(elements) {
for (let elem in elements) {
history = [...history, elements[elem]];
}
sortHistory()
}
function sortHistory() {
let newHistory = [];
history.forEach(function(item, index) {
if (newHistory.length === 0) {
newHistory.push(item)
} else {
newHistory.forEach(function(itm, idx) {
if (item.year === itm.year && item.kultivar === itm.kultivar && item.blokNommer ===
itm.blokNommer) {
item.bins = item.bins + itm.bins
} else {
newHistory.push(item)
}
})
}
})
console.log(newHistory)
}
这没有给出我想要的输出。也尝试过减少方法,没有运气。不胜感激!
答案 0 :(得分:0)
实施中的问题是您要更改itm.bins
。遍历Array.forEach会为每个元素创建一个副本,因此您为itm
更改的任何值都不会反映在实际数组中。因此,如果您想更改实际元素,则会获得idx
。
此外,您正在使用+
来添加字符串,而不是整数。您需要先将其转换为整数才能获得所需的结果。
最终代码应为:
function sortHistory(){
let newHistory = [];
history.forEach(function(item, index){
if(newHistory.length === 0){
newHistory.push(item)
} else{
newHistory.forEach(function(itm, idx){
if(item.year === itm.year && item.kultivar === itm.kultivar && item.blokNommer ===
itm.blokNommer){
newHistory[idx].bins = parseInt(item.bins) + parseInt(itm.bins);
}else{
newHistory.push(item)
}
})
}
})
console.log(newHistory);
history = newHistory;}
答案 1 :(得分:0)
您需要迭代原始数组,并使用find()
来检索history
数组中与kultivar
,blokNommer
和{{1}相匹配的现有项目},以访问year
并对其进行更新。
注意:在您的示例中,将bins
转换为bins
作为其字符串,然后将其转换回Number()
也很重要。>
string
答案 2 :(得分:0)
如果您的fruitData数组不是很大,您可以尝试对元素进行迭代,并通过indexOf
搜索JSON.stringify
整个数组,并将其转换为字符串
但是,如果数组很大,则代码不是最佳的
const fruitData = [
{datum: "2020-04-08", kultivar: "bc", ha: "5", blokNommer: "1", bins: "20", year: "2020"},
{datum: "2020-09-18", kultivar: "wb", ha: "5", blokNommer: "1", bins: "5", year: "2020"},
{datum: "2020-03-09", kultivar: "bc", ha: "5", blokNommer: "1", bins: "20", year: "2020"},
{datum: "2020-04-08", kultivar: "bc", ha: "5", blokNommer: "1", bins: "20", year: "2020"}]
const sortHistory = (myArray) => Object.keys(myArray).reduce((accum, item) => {
const currItem = JSON.stringify(myArray[item])
const allArr = JSON.stringify(accum)
return (allArr.indexOf(currItem) >= 0) ? accum : accum.concat(myArray[item])
}, [])
console.log(sortHistory(fruitData))