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)