Javascript - 如何根据数据值是否 > 0 构建一个句子来显示数据?
Javascript - How can I build a sentence to display data based on whether data values are > 0?
我正在从 API 取回数据 - 只是一个具有与每个键相关的数值的对象 - 然后构建一个简单的句子来为用户显示数据。但是,我只想在数据中包含一个大于 0 的值。这是一个模拟数据的示例:
let data = {red: 100, blue: 200, yellow: 0, green: 400};
let resultsSentence = `We found ${data.red} red posts, ${data.blue} blue posts, and ${data.green} green posts.`
console.log(resultsSentence)
如您所见,我从结果语句中删除了黄色,因为它的值为 0
。当然,我需要能够根据返回的任何数据动态生成这句话。如果我使用条件语句,那将是一团糟,因为可能的情况太多了(写 15 if/else 语句似乎不是一个好方法)。
我该如何处理?我需要根据 > 0
中的任何一个值生成句子。起初我想,很简单,我只需将所有值放入一个数组,检查是否为 0,然后从数组中删除任何等于 0 的项。然后,根据数组的长度造句,即如果数组长度为3
,则将每个值称为array[0]
、array[1]
、array[2]
。但是,这会带来一个问题,因为我需要能够在句子中弄清楚 哪些值是哪些 。例如,如果我从数组中删除 yellow
,数组长度将为 3
,但我不知道 删除了哪个 值。
谁能帮我想出一个有效的解决方案?
可能是您的浏览器过时了。
我在 Chrome 版本 102.0.5005.63(官方构建)(64 位)
上测试了您的代码
let data = {red: 100, blue: 200, yellow: 0, green: 400};
let resultsSentence = `We found ${data.red} red posts, ${data.blue} blue posts, and ${data.green} green posts.`
console.log(resultsSentence);
得到这个结果:
We found 100 red posts, 200 blue posts, and 400 green posts.
因此,除非我不明白你的问题,否则当我们包含 data
的对象以访问其属性时不会出现错误。
告诉我。
试试这个(没有依赖项)
const keys = Object.keys(data)
const values = Object.values(data)
let string = 'we found'
values.map((item, index)=>{
if(item > 0){
string += ` ${item} ${keys[index]} posts,`
}
})
console.log(string.slice(0,-1)+'.')
尝试使用 lodash as
const _ = require('lodash')
let data = {red: 100, blue: 200, yellow: 0, green: 400};
let string = 'we found'
_.map(data,(value,key)=>{
if(value > 0){
string += ` ${value} ${key} posts,`
}
})
console.log(string.slice(0,-1)+'.')
您可以使用简单的 for..of 循环遍历对象的键和值,在其中构建您的字符串。
这确实会导致 oxford comma,但您可以在条件中删除它(您选择使用 and
代替)。
let data = {red: 100, blue: 200, yellow: 0, green: 400};
let res = 'We found '
// Keep a record of how many keys we've processed so we know when we're at the end
let i = 1
for (const [k, v] of Object.entries(data)) {
// we could just continue early here, but we want to keep adding to `i`
if (v > 0) {
// This is the last key so use `and` not a comma
if (i === Object.keys(data).length) {
res += `and ${v} ${k} posts.`
} else {
res += `${v} ${k} posts, `
}
}
i++
}
console.log(res)
试试这个
let data = {red: 100, blue: 200, yellow: 0, green: 400};
let str = [];
let len = Object.keys(data).length;
Object.entries(data).forEach(([key, val], index) => {
let isLast = (len - 1 == index) && str.length > 0;
if(val > 0) str.push((isLast ? 'and ' : '') + `${val} ${key} posts`);
})
let resultsSentence = 'We found ' + str.join(', ')
console.log(resultsSentence)
我正在从 API 取回数据 - 只是一个具有与每个键相关的数值的对象 - 然后构建一个简单的句子来为用户显示数据。但是,我只想在数据中包含一个大于 0 的值。这是一个模拟数据的示例:
let data = {red: 100, blue: 200, yellow: 0, green: 400};
let resultsSentence = `We found ${data.red} red posts, ${data.blue} blue posts, and ${data.green} green posts.`
console.log(resultsSentence)
如您所见,我从结果语句中删除了黄色,因为它的值为 0
。当然,我需要能够根据返回的任何数据动态生成这句话。如果我使用条件语句,那将是一团糟,因为可能的情况太多了(写 15 if/else 语句似乎不是一个好方法)。
我该如何处理?我需要根据 > 0
中的任何一个值生成句子。起初我想,很简单,我只需将所有值放入一个数组,检查是否为 0,然后从数组中删除任何等于 0 的项。然后,根据数组的长度造句,即如果数组长度为3
,则将每个值称为array[0]
、array[1]
、array[2]
。但是,这会带来一个问题,因为我需要能够在句子中弄清楚 哪些值是哪些 。例如,如果我从数组中删除 yellow
,数组长度将为 3
,但我不知道 删除了哪个 值。
谁能帮我想出一个有效的解决方案?
可能是您的浏览器过时了。
我在 Chrome 版本 102.0.5005.63(官方构建)(64 位)
上测试了您的代码let data = {red: 100, blue: 200, yellow: 0, green: 400};
let resultsSentence = `We found ${data.red} red posts, ${data.blue} blue posts, and ${data.green} green posts.`
console.log(resultsSentence);
得到这个结果:
We found 100 red posts, 200 blue posts, and 400 green posts.
因此,除非我不明白你的问题,否则当我们包含 data
的对象以访问其属性时不会出现错误。
告诉我。
试试这个(没有依赖项)
const keys = Object.keys(data)
const values = Object.values(data)
let string = 'we found'
values.map((item, index)=>{
if(item > 0){
string += ` ${item} ${keys[index]} posts,`
}
})
console.log(string.slice(0,-1)+'.')
尝试使用 lodash as
const _ = require('lodash')
let data = {red: 100, blue: 200, yellow: 0, green: 400};
let string = 'we found'
_.map(data,(value,key)=>{
if(value > 0){
string += ` ${value} ${key} posts,`
}
})
console.log(string.slice(0,-1)+'.')
您可以使用简单的 for..of 循环遍历对象的键和值,在其中构建您的字符串。
这确实会导致 oxford comma,但您可以在条件中删除它(您选择使用 and
代替)。
let data = {red: 100, blue: 200, yellow: 0, green: 400};
let res = 'We found '
// Keep a record of how many keys we've processed so we know when we're at the end
let i = 1
for (const [k, v] of Object.entries(data)) {
// we could just continue early here, but we want to keep adding to `i`
if (v > 0) {
// This is the last key so use `and` not a comma
if (i === Object.keys(data).length) {
res += `and ${v} ${k} posts.`
} else {
res += `${v} ${k} posts, `
}
}
i++
}
console.log(res)
试试这个
let data = {red: 100, blue: 200, yellow: 0, green: 400};
let str = [];
let len = Object.keys(data).length;
Object.entries(data).forEach(([key, val], index) => {
let isLast = (len - 1 == index) && str.length > 0;
if(val > 0) str.push((isLast ? 'and ' : '') + `${val} ${key} posts`);
})
let resultsSentence = 'We found ' + str.join(', ')
console.log(resultsSentence)