我正在努力遵循以下邏輯。
我在運行給定的字串時創建以下物件陣列。
[{"word":"Frank","c":1},
{"word":"Irina","c":1},
{"word":"Frank","c":1},
{"word":"Frank","c":1},
{"word":"Thomas","c":1}]
我想要實作的是:
[{"word":"Frank","c":3},
{"word":"Irina","c":1},
{"word":"Thomas","c":1}]
這里最好的方法是什么?
我將字串發送到此函式并創建陣列。但我無法得到我想要的。
function words(str) {
return str.split(" ").reduce(function(count, word) {
if(word.length>2&&isLetter(word)){
data.push({word:word, count: 1});
}
}, {});
}
感謝阿德里安的幫助
uj5u.com熱心網友回復:
您可以使用物件累加器來保持每個單詞的計數,然后使用Object.values()獲取所有值。
function words(str) {
return Object.values(str.split(" ").reduce((result, word) => {
result[word] ??= {word, count: 0};
result[word].count = 1;
return result;
}, {}));
}
console.log(words("Frank Irina Frank Frank Thomas"));
.as-console-wrapper { max-height: 100% !important; top: 0; }
uj5u.com熱心網友回復:
假設 c 并不總是 1(在這種情況下,您可以按照另一篇文章的建議進行操作并只計算單詞數),您可以這樣做,回圈遍歷資料并將 c 值匯總到緩沖區中,使用 word作為緩沖區的關鍵。然后將緩沖區值映射到最終陣列。
const data = [{"word":"Frank","c":1},
{"word":"Irina","c":1},
{"word":"Frank","c":1},
{"word":"Frank","c":1},
{"word":"Thomas","c":1}];
//console.log(data);
let buffer = {};
data.forEach(i=>{
let w = i.word;
let words = buffer[w] || {word: w, c: 0};
words.c = i.c*1 words.c;
buffer[w] = words;
});
let final = Object.values(buffer).map(b=>{
return {word: b.word, c: b.c};
});
console.log(final);
這適用于任何 c 值:
const data = [{"word":"Frank","c":2},
{"word":"Irina","c":4},
{"word":"Frank","c":1},
{"word":"Frank","c":3},
{"word":"Thomas","c":1}];
//console.log(data);
let buffer = {};
data.forEach(i=>{
let w = i.word;
let words = buffer[w] || {word: w, c: 0};
words.c = i.c*1 words.c;
buffer[w] = words;
});
let final = Object.values(buffer).map(b=>{
return {word: b.word, c: b.c};
});
console.log(final);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/361797.html
標籤:javascript 数组 json
上一篇:C#:在佇列中存盤和寫入坐標
下一篇:檢查lisp中陣列的每個元素
