返回

JavaScript 数据筛选技巧:如何筛选价格递增的商品列表?

javascript

在数据处理过程中,我们经常会遇到需要根据特定条件筛选数据的场景。比如,我们有一个包含商品信息的列表,每个商品都有价格属性,现在需要筛选出价格变化满足特定条件的商品。具体来说,我们希望构建一个新的列表,其中每个元素的价格都比前一个元素的价格大至少 1。

面对这样的需求,我们可以采用一种逐步构建新列表的方法。首先,创建一个空数组 finalList 用于存储筛选结果。然后,引入一个变量 lastAddedPrice 来记录上一个添加到 finalList 中的元素的价格,初始值可以设置为 null 或一个极小值,具体取决于实际情况。

接下来,遍历原始列表 lists 中的每个元素。对于第一个元素,由于 finalList 为空,我们直接将其添加到 finalList 中,并将 lastAddedPrice 更新为该元素的价格。

对于后续的每个元素,我们计算它与 lastAddedPrice 的差值。如果差值大于等于 1,说明该元素满足条件,则将其添加到 finalList 中,并更新 lastAddedPrice 为该元素的价格。如果差值小于 1,则忽略该元素,继续处理下一个元素。

通过这样的遍历和比较,我们可以逐步构建出符合条件的新列表 finalList

下面我们用 JavaScript 代码来实现这个筛选逻辑:

const lists = [
  { id: "1", price: 10 },
  { id: "2", price: 10.5 },
  { id: "3", price: 11 },
  { id: "4", price: 11.3 },
  { id: "5", price: 12 },
  { id: "6", price: 11.5 },
  { id: "7", price: 12 },
  { id: "8", price: 11 },
];

const finalList = [];
let lastAddedPrice = null;

for (const item of lists) {
  if (finalList.length === 0) {
    finalList.push(item);
    lastAddedPrice = item.price;
  } else {
    const priceDiff = item.price - lastAddedPrice;
    if (priceDiff >= 1) {
      finalList.push(item);
      lastAddedPrice = item.price;
    }
  }
}

console.log(finalList);

运行这段代码,我们会得到以下输出:

[
  { id: '1', price: 10 },
  { id: '3', price: 11 },
  { id: '4', price: 11.3 },
  { id: '5', price: 12 },
  { id: '8', price: 11 }
]

可以看到,输出结果符合我们的预期,finalList 中的每个元素的价格都比前一个元素的价格大至少 1。

这种基于差值比较的筛选方法简单直观,易于理解和实现。在实际应用中,我们可以根据具体需求调整差值的阈值,或者引入更多的筛选条件,例如商品类别、库存数量等,从而实现更加复杂的筛选逻辑。

常见问题解答

1. lastAddedPrice 的初始值为什么要设置为 null

答:lastAddedPrice 的初始值设置为 null 是为了区分第一个元素。当处理第一个元素时,finalList 为空,我们需要无条件地将第一个元素添加到 finalList 中,并将 lastAddedPrice 设置为第一个元素的价格。如果将 lastAddedPrice 初始化为其他值,可能会导致第一个元素被错误地过滤掉。

2. 如果希望筛选出价格比前一个元素价格大至少 2 的元素,应该如何修改代码?

答:只需要将代码中 priceDiff >= 1 的条件修改为 priceDiff >= 2 即可。

3. 除了 JavaScript,这种筛选逻辑还可以用其他编程语言实现吗?

答:当然可以。这种筛选逻辑的核心思想是遍历列表并根据条件进行比较,这在大多数编程语言中都可以实现。例如,可以使用 Python 的列表推导式或者 Java 的循环结构来实现同样的功能。

4. 这种筛选方法的时间复杂度是多少?

答:这种筛选方法的时间复杂度是 O(n),其中 n 是原始列表的长度。这是因为我们需要遍历列表中的每个元素一次。

5. 这种筛选方法的空间复杂度是多少?

答:这种筛选方法的空间复杂度是 O(m),其中 m 是筛选结果 finalList 的长度。在最坏情况下,所有元素都满足筛选条件,则 m 等于 n。在最好情况下,没有元素满足筛选条件,则 m 等于 0。