提问人:MeltingDog 提问时间:5/10/2023 更新时间:5/10/2023 访问量:33
在将对象推送到数组时,如何摆脱这个额外的级别?
How can I get rid of this extra level when pushing objects to an array?
问:
我正在使用 Jquery 读取 JSON 文件,并将该文件中的选定项过滤到一个新数组中。
JSON 文件如下所示:
[
{
"id": "1234",
"label": "Product 1",
"price": "140"
},
{
"id": "5678",
"label": "Product 2",
"price": "199"
},
{
"id": "9012",
"label": "Product 3",
"price": "500"
},
// etc
]
我正在使用以下代码来检索所需的数据:
const activeProdIDs = [
1234,
9012
];
let filteredJson = [];
$.ajax({
url: dataURL,
type: "GET",
dataType: "json",
success: function (myJson) {
activeProdIDs.forEach(function(prodID) {
filteredJson.push(myJson.filter(item => item.id == prodID));
});
console.log(filteredJson);
},
error: function () {
console.log("Something went wrong");
},
});
这有效,但返回的数组有一个额外的级别/层:
[
[
{
"id": "1234",
"label": "Product 1",
"price": "140"
}
],
[
{
"id": "9012",
"label": "Product 3",
"price": "500"
}
],
//etc
]
因此,与其像我必须做的那样访问产品的标签。filteredJson[0].label
filteredJson[0][0].label
有谁知道为什么过滤器将 JSON 对象推送为它们自己的数组,以及我能做些什么来解决这个问题?
(如果我将 JSON 对象添加到另一个对象而不是数组中,这似乎也会发生这种情况)。
答:
1赞
Phil
5/10/2023
#1
问题是 Array.prototype.filter() 返回一个数组,您只在其中查找单个元素。
您可以改用 Array.prototype.find(),但我建议坚持使用一组 ID 进行更高性能的查找filter()
const ids = new Set(activeProdIDs.map(String)); // match types
const filteredJson = myJson.filter(({ id }) => ids.has(id));
注意:这将按照匹配记录的出现顺序返回匹配的记录。您的原始代码按照 ID 出现的顺序返回记录,因此如果这是一个问题,请明确说明。myJson
activeProdIDs
1赞
Sten
5/10/2023
#2
在这种情况下,您需要使用 find 函数:
filteredJson = activeProdIDs.map(id => myJson.find(item => item.id == id)).filter(item => item !== undefined)
上一个:从对象数组中获取值
评论
let filtered = myJson.filter(el => activeProdIds.includes(el.id))