【问题标题】:Comparing one object containing array of objects with simple array将包含对象数组的一个对象与简单数组进行比较
【发布时间】:2021-04-22 22:59:04
【问题描述】:

我正在使用 Nodejs,并且有一个对象包含一组对象(API 请求的结果)和一个简单的值数组。

它们看起来像这样:

// Object > Array > Objects (retrieved from an API request) :
{
    "data": [
        {
            "id": 1,
            "name": "Jimmy"
        },
        {
            "id": 825,
            "name": "Billy"
        },
    ]
}

// Simple array :
[1, 825, …]

如何将包含对象数组的对象与简单数组进行比较?

我正在寻找的是,从简单数组中获取 ID,并将它们与其他“复杂”对象进行比较,以检索 name 属性与简单数组中的相应 ID 和其他对象属性 id ,然后将结果存储在对象数组中。

简单地说,我想要这样的结果:

[
    { id: 1, name: "Jimmy" },
    { id: 825, name: "Billy" }
]

由于从 API 请求中检索到“复杂”对象,我尝试了以下操作:

const ids = await axios.get(/* API CALL */);

for (let i in ids.data) {
    ids.data[i].map(el => console.log(el.name));
}

但这给了我一个错误,说我不能map ids.data[i],即使当我console.log(ids.data[i]) 时,我还是从初始对象到达内部数组。

我也尝试直接使用.map() 而不使用for ... in 循环,但这也不起作用。也尝试了reduce,但结果相同。

我应该如何处理这个问题?请注意,来自 API 的响应是一个对象包含一个包含数千个对象的数组。

非常感谢

【问题讨论】:

  • ids.data[i] 应该是来自data 的单个对象,对吧?你试过用ids.data.map替换outer for吗?

标签: javascript node.js arrays


【解决方案1】:

这里有两种不同的单行方法。

const result = {

      data: [
        {
          id: 1,
          name: "Jimmy"
        },
        {
          id: 825,
          name: "Billy"
        }
      ]
    };
    
    const ids = [1, 825, 12, 'xx'];
    
    let output = result.data.filter((obj) => ids.includes(obj.id));
    console.log(output);
    
    output = ids.map((id) => result.data.find((o) => o.id === id));    
    console.log(output.filter(obj=>obj !== undefined));

【讨论】:

  • 感谢您的意见。但是,就性能而言,使用reduce 如下面的答案所示不是更快吗?因为该对象可以在 data 数组中包含 +5000 个具有大量属性的条目。
  • 我真的没有在我的回答中看到任何性能问题。你能提供更多细节吗?
  • 我的错,我认为这是一个 O(n^2) 操作,但检查后似乎不是。谢谢!
【解决方案2】:

只需使用reduce,如果id 存在于simpleArray 中,则将其推入acc

const obj = {
  data: [
    {
      id: 1,
      name: "Jimmy",
    },
    {
      id: 825,
      name: "Billy",
    },
  ],
};

const simpleArray = [1, 825, 419];

const result = obj.data.reduce((acc, curr) => {
  const { id, name } = curr;
  const isExist = simpleArray.includes(id);
  if (isExist) acc.push({ id, name });
  return acc;
}, []);

console.log(result);

您也可以使用另一种方法,即在simpleArray 中逐个进行,并比较obj 中的id 形成所需的数组。

const obj = {
  data: [
    {
      id: 1,
      name: "Jimmy",
    },
    {
      id: 825,
      name: "Billy",
    },
  ],
};

const simpleArray = [1, 825, 419];

const result = simpleArray.reduce((acc, curr) => {
  const elementInObject = obj.data.find((o) => o.id === curr);
  if (elementInObject) acc.push(elementInObject);
  return acc;
}, []);

console.log(result);

【讨论】:

  • 感谢您的回答。你会说哪个表演最好?因为obj 在它包含的data 数组中可以有+5000 个对象。谢谢
  • 两者的性能比较相同。没有太大区别。所以选择一个。
猜你喜欢
  • 2018-08-04
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
相关资源
最近更新 更多