在将对象推送到数组时,如何摆脱这个额外的级别?

How can I get rid of this extra level when pushing objects to an array?

提问人:MeltingDog 提问时间:5/10/2023 更新时间:5/10/2023 访问量:33

问:

我正在使用 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].labelfilteredJson[0][0].label

有谁知道为什么过滤器将 JSON 对象推送为它们自己的数组,以及我能做些什么来解决这个问题?

(如果我将 JSON 对象添加到另一个对象而不是数组中,这似乎也会发生这种情况)。

JavaScript jQuery 数组 JSON 对象

评论

0赞 James 5/10/2023
let filtered = myJson.filter(el => activeProdIds.includes(el.id))

答:

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 出现的顺序返回记录,因此如果这是一个问题,请明确说明。myJsonactiveProdIDs

1赞 Sten 5/10/2023 #2

在这种情况下,您需要使用 find 函数:

filteredJson = activeProdIDs.map(id => myJson.find(item => item.id == id)).filter(item => item !== undefined)