【问题标题】:how to get array from object with index as one of the object property如何从具有索引的对象中获取数组作为对象属性之一
【发布时间】:2021-07-23 10:05:04
【问题描述】:

我有一个对象

const items = {
  "123": {
    "key": 123,
    "name": "one name",
    },
    "456": {
    "key": 456,
    "name": "two name",
    },
    "789": {
    "key": 789,
    "name": "three name",
    },
    };

需要从下面的数组中过滤这个,数组索引为object.key

const myFilter = [123,789];

我正在尝试的代码如下,但它返回数组 inedx 为 0,1,2... 但我需要索引为 object.key。

let selectedItems = myFilter.map((key) => {
        return items[key];
      });

当前输出:

[0:{
  key: 123,
  name: "one name"
}, 1: {
  key: 789,
  name: "three name"
}]

预期输出

[123:{
  key: 123,
  name: "one name"
}, 789: {
  key: 789,
  name: "three name"
}] 

jsfiddle - https://jsfiddle.net/kb374exh/2/

【问题讨论】:

  • 您的预期输出不是有效的数组,甚至不是一个对象。
  • 是的,而且您的 items 变量是对象对象而不是对象数组。所以,你不能为此使用数组方法
  • 另外,为什么123789 而不是456
  • @ikiK - 我尝试编辑输出格式。基本上我需要一个数组索引作为对象的关键属性,而不是 0,1,2....,对不起,如果它令人困惑

标签: javascript arrays ecmascript-6 filter reducers


【解决方案1】:

您的实际输出实际上是正确的,并且是将myFilter 数组映射到items 的匹配属性的唯一可能结果。

const items = {
  "123": {
    "key": 123,
    "name": "one name",
  },
  "456": {
    "key": 456,
    "name": "two name",
  },
  "789": {
    "key": 789,
    "name": "three name",
  },
};

const myFilter = [123, 789];

const selectedItems = myFilter.map((key) => items[key]);

console.log(selectedItems);

您看到的记录输出包括数组索引。您可能会在登录浏览器时看到包含的索引。

如果您想要一个对象数组,其中原始键是新索引,那么您可以做的最好的可能是一个长度为 的数组和一堆根本未定义的“洞”。

const items = {
  "123": {
    "key": 123,
    "name": "one name",
  },
  "456": {
    "key": 456,
    "name": "two name",
  },
  "789": {
    "key": 789,
    "name": "three name",
  },
};

const myFilter = [123, 789];

const selectedItems = Object.entries(items).reduce((selectedItems, [key, value]) => {
  if (myFilter.includes(value.key)) selectedItems[key] = value;
  return selectedItems;
}, []);

console.log(selectedItems);

如果你对结果是一个对象没问题,那么你可以得到更简洁的输出,你基本上会得到一个过滤掉键值对的对象。

const items = {
  "123": {
    "key": 123,
    "name": "one name",
  },
  "456": {
    "key": 456,
    "name": "two name",
  },
  "789": {
    "key": 789,
    "name": "three name",
  },
};

const myFilter = [123, 789];

const selectedItems = Object.fromEntries(Object.entries(items).filter(([, value]) => myFilter.includes(value.key)));

console.log(selectedItems);

【讨论】:

  • 惊人的@Drew-reese,这个解决方案对我有用。
  • @codingHack 如果此答案对您有用,那么我邀请您将其标记为已接受的答案。如果您发现它并且解释有帮助,那么不要忘记也投票。干杯。
猜你喜欢
  • 2018-04-13
  • 2019-05-20
  • 2017-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 2022-01-07
相关资源
最近更新 更多