更新数组内对象的属性

时间:2020-04-10 08:10:58

标签: javascript html

单击按钮后,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)
}

这没有给出我想要的输出。也尝试过减少方法,没有运气。不胜感激!

3 个答案:

答案 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数组中与kultivarblokNommer和{{1}相匹配的现有项目},以访问year并对其进行更新。

注意:在您的示例中,将bins转换为bins作为其字符串,然后将其转换回Number()也很重要。

string

find() Number()

答案 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))