【问题标题】:Do I need to convert this Array in Objects?我需要在对象中转换这个数组吗?
【发布时间】:2018-03-11 17:15:56
【问题描述】:

我的data 是一个数组,我将其转换为key:value(不确定这是否是它的名称)类型。

数据:

[
    {
        "id": 1,
        "title": "Name 01",
        "tags": [
            "TAG1",
            "TAG4",
            "TAG2"
        ]
    },
    {
        "id": 2,
        "title": "Name 02",
        "tags": [
            "TAG4",
            "TAG3"
        ]
    },
    {
        "id": 3,
        "title": "Name 03",
        "tags": [
            "TAG1"
        ]
    }
]

我将其转换为:

result = data.map(a => ({ [a.id]: a }));

所以我得到:

结果:

[
    {
        "1": {
            "id": 1,
            "title": "Post1 T1 T2 T4",
            "tags": [
                "TAG1",
                "TAG4",
                "TAG2"
            ]
        }
    },
    {
        "2": {
            "id": 2,
            "title": "Post1 T3 T4",
            "tags": [
                "TAG4",
                "TAG3"
            ]
        }
    },
    {
        "3": {
            "id": 3,
            "title": "Post3 with No Tags",
            "tags": [
                "TAG1"
            ]
        }
    }
]

如何映射结果并显示在 View/Text 中?

我试过了:

Object.keys(results).map((result, idx) => {
  return(
      <View key={idx}>
        <Text>{result.title}</Text>
      </View>
    )
});

但我收到一个错误:Cannot read property 'map' of undefined.

我是否需要将结果转换为对象,然后才能使用Object.keys。如果是,我如何将整个结果转换为这样的对象:

结果:

{
    {
        "1": {
            "id": 1,
            "title": "Post1 T1 T2 T4",
            "tags": [
                "TAG1",
                "TAG4",
                "TAG2"
            ]
        }
    },
    {
        "2": {
            "id": 2,
            "title": "Post1 T3 T4",
            "tags": [
                "TAG4",
                "TAG3"
            ]
        }
    },
    {
        "3": {
            "id": 3,
            "title": "Post3 with No Tags",
            "tags": [
                "TAG1"
            ]
        }
    }
}

我这样做的原因是针对减速器调度操作的 id:

  switch (action.type) {
    case "INC_NUM":
         const newState = {...state};
         newState[action.payload].nubmer++;
         return newState;

【问题讨论】:

  • 呃,嗯。为什么?你所做的就是用另一个对象包装每个内部对象,这有什么目的?它所做的只是强迫您使用theArray[0][1].id 而不是theArray[0].id 来引用对象。它实际上没有任何生产力。
  • 这就是你否决我的问题的原因吗?我更新了它。当前的data/result 里面没有number 键。但我试图先对此进行排序。如果对象的id 未在数组外部定义,您将如何建议将这些对象的数组作为目标?
  • 它本来就是这样,因为数组是从 0 开始索引的。所以 id1 是 0,id2 是 1,等等。假设你没有任何缺失的 id,这应该线性地继续。但是,您可以将数组转换为遵循类似结构的对象,其中键是 id。
  • 这就是我在第一次展示的 Result 中所做的。但我无法用map 展示它。这是这篇文章的最初问题。请帮忙。
  • 不,你得到的结果仍然是一个数组。

标签: javascript arrays reactjs react-native ecmascript-6


【解决方案1】:

听起来您只是希望能够快速找到具有给定 id 值的对象。我建议您不要“转换”您的数据,而是制作一张地图,以便您可以通过 id 查找任何对象。

let data = [
    {
        "id": 1,
        "title": "Name 01",
        "tags": [
            "TAG1",
            "TAG4",
            "TAG2"
        ]
    },
    {
        "id": 2,
        "title": "Name 02",
        "tags": [
            "TAG4",
            "TAG3"
        ]
    },
    {
        "id": 3,
        "title": "Name 03",
        "tags": [
            "TAG1"
        ]
    }
];

// create a map with id as the key, object as the value
let map = new Map();
data.forEach(obj => {
   map.set(obj.id, obj);
});

// look up a given id
console.log(map.get(3));

【讨论】:

  • 为什么投反对票?请告诉我这个答案有什么问题,以便我更正或改进它。无缘无故的否决对社区真的没有多大帮助。
  • 即使我的问题被否决了,我仍然不明白为什么。我问了一个问题,而不是解释他们只是投反对票。不酷。它们使初学者难以学习。
  • @Somename - 您的问题可能被否决,因为它不是很清楚。您需要在问题中做的第一件事是解释您要解决的实际问题。准确显示您想要的输出或您尝试使用的代码。您花费大量精力记录您尝试过的所有代码,但很少解释您要解决的根本问题是什么。我不得不猜测这就是你想要的,因为你的问题不是很清楚。这个网站要求你写出很多人不擅长的明确问题。
  • @Somename - 而且,虽然我们正在这样做,但这个答案是否解决了您的问题?如果不是,请解释原因,然后再澄清您的问题。
  • 您的回答实际上解决了这个问题。这正是我正在寻找的。我现在想弄清楚如何处理减速器中的动作。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-06-07
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多