Javascript 按对象属性值过滤对象数组

问题描述 投票:0回答:1

我被难住了。我正在尝试将对象数组过滤为仅在对象属性之一中包含特定字符串的对象。该数组被传递到 NodeRed 中的 javascript 函数中,因此我对数组的格式做了一些假设。这是我的数组的输出: Array output 我正在寻找一种方法来将数组过滤为仅“状态”以“Z_”前缀开头的对象。最终结果是使用 last 条目,因为我需要最新的“Z_”状态,并且数组按时间戳排序。也就是说,我相信我需要一个“Z_”状态数组来获取最后一个条目,这意味着我无法使用“查找”函数或类似的函数来识别第一个匹配项。我还期望数组中的多个对象中有重复的“Z_”值,因此我不能依赖任何东西来寻找唯一值。

在我看来,最好的做法是使用适当的函数来完成此操作,而不是使用迭代循环?

在过滤上述数组时,我希望结果是一个包含 2 个条目的数组,即“state”:“Z_Rain”和“Z_Blues”条目。

我尝试使用 array.filter ,结果出现“TypeError:X.filter 不是函数”。我相信这是因为数组是对象数组,所以我尝试了 Object.values(array) 但无济于事。我还尝试了一些带有 > / => / 等运算符的 X.filter() 变体。

javascript node-red
1个回答
0
投票

您看到的 TypeError: X.filter is not a function 错误表明您尝试过滤的对象不是数组,或者结构不是您所期望的。如果结构与一系列对象一致,但直接访问它有问题,您可能需要在过滤之前确保数据格式准确。

假设您的对象数组已正确组织如下:

const data = [
  { timestamp: 123456, state: 'Z_Rain' },
  { timestamp: 234567, state: 'Other_State' },
  { timestamp: 345678, state: 'Z_Blues' },
];

可以使用filter()函数结合startsWith()对数组进行过滤,以获得“state”以“Z_”开头的项目:

const filteredData = data.filter(obj => obj.state.startsWith('Z_'));

因此,“state”属性以“Z_”开头的项目将包含在filteredData中。之后,您可以按时间戳对这个过滤后的数组进行排序以获得最新的条目:

const sortedFilteredData = filteredData.sort((a, b) => b.timestamp - a.timestamp);
const mostRecentZState = sortedFilteredData[0];
© www.soinside.com 2019 - 2024. All rights reserved.