iT邦幫忙

0

在內含物件的陣列中無法各別增加屬性

如題,懇請各位大大解答,謝謝

Question data format
[{ id: 0, name: "temp0", option: ["A", "B"] }, { id: 1, name: "temp1", option: ["A", "C"] }]

 const mysqlQuery = () => {
        return new Promise((resolve) => {
            question.map(x => {
                mysqldb.query(sql, (err, rows, fields) => {
                    if (!err) {
                        x.totalQCount = rows[0].NumberOfQ //add new attribute and value
                        console.log(x.totalQCount) //display the value
                        console.log(x) //But not display new attribute and value
                        resolve(rows)
                    }
                })//end mysql query
            })//end for
        })
    } //end Promise
} //end for
 await mysqlQuery();

另外的版本也無法運行

for (let i = 0; i < question.length; i++) {
  
    const mysqlQuery = () => {
        return new Promise((resolve) => {
            mysqldb.query("select COUNT(UID) AS NumberOfQ FROM AnswerState where QID =?", [question[i]._id.toString()], (err, rows, fields) => {
         
                if (!err) {
                    // console.log(rows);
                    // question[i].totalQCount = rows[0].NumberOfQ
              
                    temp = rows[0].NumberOfQ
                    resolve(rows)
                } else {
                    console.log(err);
                }
            })//end mysql query
        })
    } //end Promise
    await mysqlQuery()
    question[i].totalQCount = 123

    console.log(question[i].totalQCount)
    console.log(question) // 一樣沒有增加新屬性與新值
}//end for
看更多先前的討論...收起先前的討論...
Han iT邦新手 4 級 ‧ 2020-06-04 11:35:44 檢舉
會是console.log異步的問題嗎.. 真的是謎之js XD
p39212053 iT邦新手 5 級 ‧ 2020-06-04 11:40:42 檢舉
有回傳到前端看,一樣是這個結果
JS非同步真的是大謎團 T—T
你在resolve 之前拿到的應該是 pending 吧 ?
在 for 迴圈裡 重複用 const 宣告居然不會跳錯誤...
dragonH iT邦超人 5 級 ‧ 2020-06-04 11:56:37 檢舉
阿印出來是什麼
p39212053 iT邦新手 5 級 ‧ 2020-06-04 12:06:10 檢舉
question[i].totalQCount 會顯示出123
而question裡面一樣是原資料, 沒有增加totalQCount這個屬性及123的值
第一個方法 map 你要回寫到 question 才有用啊
第二個 for 迴圈要看 question 定義在哪
p39212053 iT邦新手 5 級 ‧ 2020-06-04 12:40:20 檢舉
第二個定義在for迴圈的外面
可能要更多資訊才能知道為什麼
我用你的方式做是有東西的
3
fillano
iT邦超人 1 級 ‧ 2020-06-04 15:23:01
最佳解答

強烈建議你先用callback就好,理清思路。(包含async/await, Promise, const、let、arrow都先不要用,除非你很清楚他在做什麼)

另外,用console.log輸出物件時,先用JSON.stringify把他轉成json字串,不然console.log輸出的不是物件在傳給console.log時當下的狀態。

p39212053 iT邦新手 5 級 ‧ 2020-06-04 18:50:39 檢舉

謝謝f大提點

0
浩瀚星空
iT邦超人 1 級 ‧ 2020-06-04 11:10:46

試試用

question[i][totalQCount] = 123
p39212053 iT邦新手 5 級 ‧ 2020-06-04 11:15:57 檢舉

有試過了 一樣沒有辦法,也有用Object.assign(),但是也無法

0
通靈亡
iT邦研究生 5 級 ‧ 2020-06-04 11:39:39

可是我剛才測試直接 questions[i].totalCount = 100 是有效的
https://jsfiddle.net/p40de3kv/3/

let questions = [{ id: 0, name: "temp0", option: ["A", "B"] },
				 { id: 1, name: "temp1", option: ["A", "C"] }];
                 
console.log("Orginal Questions:" , questions)

for (let i = 0; i < questions.length; i++) {
  questions[i].totalCount = 100
  console.log((i+1) + "'s Question:" , questions[i])
}

/* let i = 1;
questions.map(question => {
  question.totalCount = 100;
  console.log((i++) + "'s Question:", question)
  
  return question;
}) */

console.log("Adjust Questions:" , questions)
"Orginal Questions:", [{
  id: 0,
  name: "temp0",
  option: ["A", "B"]
}, {
  id: 1,
  name: "temp1",
  option: ["A", "C"]
}]
"1's Question:", {
  id: 0,
  name: "temp0",
  option: ["A", "B"],
  totalCount: 100
}
"2's Question:", {
  id: 1,
  name: "temp1",
  option: ["A", "C"],
  totalCount: 100
}
"Adjust Questions:", [{
  id: 0,
  name: "temp0",
  option: ["A", "B"],
  totalCount: 100
}, {
  id: 1,
  name: "temp1",
  option: ["A", "C"],
  totalCount: 100
}]
看更多先前的回應...收起先前的回應...
p39212053 iT邦新手 5 級 ‧ 2020-06-04 11:42:37 檢舉

在MYSQL QUERY之下這個會變無效的, 不過還是謝謝你的回答
/images/emoticon/emoticon41.gif

通靈亡 iT邦研究生 5 級 ‧ 2020-06-04 11:47:43 檢舉

你的 console.log(question[i].totalQCount) 出來有值還是undefind ?

你把它改成 console.log(i, question[i].totalQCount),看一下出來的結果是什麼。

p39212053 iT邦新手 5 級 ‧ 2020-06-04 12:06:50 檢舉

question[i].totalQCoun會出來值123

通靈亡 iT邦研究生 5 級 ‧ 2020-06-04 12:08:53 檢舉

你試試看這兩行出來的結果:
console.log(i, question[i].totalQCount)
console.log(i, question[i])

p39212053 iT邦新手 5 級 ‧ 2020-06-04 12:17:45 檢舉

0 123
0 { id: 0, name: "temp0", option: ["A", "B"] }

通靈亡 iT邦研究生 5 級 ‧ 2020-06-04 12:52:38 檢舉

是不是出來的json是readonly
下面這個問題跟你的情境很像

你在最上面加上:
'use strict';
看會不會跑出錯誤訊息。

https://stackoverflow.com/questions/58674443/why-cant-i-change-object-property-in-javascript

p39212053 iT邦新手 5 級 ‧ 2020-06-04 18:52:06 檢舉

已解決問題~ 感謝回答/images/emoticon/emoticon41.gif

我要發表回答

立即登入回答