如何在React中以表格形式显示嵌套对象数组。

huangapple go评论78阅读模式
英文:

how to display array of nested object in table using react

问题

以下是您要翻译的内容:

我有一个嵌套的数组对象,需要在React中以表格格式显示。
我尝试了下面的代码,但不知道如何显示如下所示的表格。
var countdetails = [
  {
    enabled: { IN: 354, MY: 181 },
    pending: { IN: 34, MY: 11 },
    total: { IN: 388, MY: 192 }
  }
];

export default function App() {
  return (
    <div className="App">
      <table>
        {countdetails.map((e) => (
          <>
            <tr>
              <td>countries</td>
              <td>enabled</td>
              <td>pending</td>
            </tr>
            <tr>
              <td>{Object.keys(e.enabled)}</td>
              <td>{Object.values(e.enabled)}</td>
              <td>{Object.values(e.pending)}</td>
            </tr>
          </>
        ))}
      </table>
    </div>
  );
}
预期输出
countries enabled pending
IN         354     34
MY         181     11

请注意,我只为您翻译了代码和相关的注释,不包括问题的回答。

英文:

I have nested array object and need to display as table format using react.
I tried below code and got stuck how to display as such

var countdetails = [
  {
    enabled: { IN: 354, MY: 181 },
    pending: { IN: 34, MY: 11 },
    total: { IN: 388, MY: 192 }
  }
];

export default function App() {
  return (
    &lt;div className=&quot;App&quot;&gt;
      &lt;table&gt;
        {countdetails.map((e) =&gt; (
          &lt;&gt;
            &lt;tr&gt;
              &lt;td&gt;countries&lt;/td&gt;
              &lt;td&gt;enabled&lt;/td&gt;
              &lt;td&gt;pending&lt;/td&gt;
            &lt;/tr&gt;
            &lt;tr&gt;
              &lt;td&gt;{Object.keys(e.enabled)}&lt;/td&gt;
              &lt;td&gt;{Object.values(e.enabled)}&lt;/td&gt;
              &lt;td&gt;{Object.values(e.pending)}&lt;/td&gt;
            &lt;/tr&gt;
          &lt;/&gt;
        ))}
      &lt;/table&gt;
    &lt;/div&gt;
  );
}


Expected Output

countries enabled pending
IN         354     34
MY         181      11

答案1

得分: 2

UI由数据驱动。将其转换为更适合表格的数据结构。

const columns = [
	{ title: '国家', dataIndex: 'countries' },
	{ title: '已启用', dataIndex: 'enabled' },
	{ title: '待处理', dataIndex: 'pending' },
];
const dataSource = [
	{
		countries: '印度',
		enabled: 354,
		pending: 34,
	},
	{
		countries: '马来西亚',
		enabled: 181,
		pending: 11,
	},
];

export default function App() {
	return (
		<div className="App">
			<table>
				<tr>
					{columns.map((col) => (
						<th>{col.title}</th>
					))}
				</tr>
				{dataSource.map((data) => {
					return (
						<tr>
							{columns.map((col) => (
								<td>{data[col.dataIndex]}</td>
							))}
						</tr>
					);
				})}
			</table>
		</div>
	);
}

输出:

如何在React中以表格形式显示嵌套对象数组。

codesandbox

英文:

The UI is driven by data. Convert to a data structure more suitable for tables.

const columns = [
	{ title: &#39;Countries &#39;, dataIndex: &#39;countries&#39; },
	{ title: &#39;Enabled&#39;, dataIndex: &#39;enabled&#39; },
	{ title: &#39;Pending&#39;, dataIndex: &#39;pending&#39; },
];
const dataSource = [
	{
		countries: &#39;IN&#39;,
		enabled: 354,
		pending: 34,
	},
	{
		countries: &#39;MY&#39;,
		enabled: 181,
		pending: 11,
	},
];

export default function App() {
	return (
		&lt;div className=&quot;App&quot;&gt;
			&lt;table&gt;
				&lt;tr&gt;
					{columns.map((col) =&gt; (
						&lt;th&gt;{col.title}&lt;/th&gt;
					))}
				&lt;/tr&gt;
				{dataSource.map((data) =&gt; {
					return (
						&lt;tr&gt;
							{columns.map((col) =&gt; (
								&lt;td&gt;{data[col.dataIndex]}&lt;/td&gt;
							))}
						&lt;/tr&gt;
					);
				})}
			&lt;/table&gt;
		&lt;/div&gt;
	);
}

Output:

如何在React中以表格形式显示嵌套对象数组。

codesandbox

答案2

得分: 1

以下是您要翻译的内容:

这是实现您期望输出的代码:

链接:https://codesandbox.io/s/stackoverflow-solution-jgz6nw

完整代码:

var countdetails = [
  {
    enabled: { IN: 354, MY: 181 },
    pending: { IN: 34, MY: 11 },
    total: { IN: 388, MY: 192 }
  }
];

export default function App() {
  return (
    <div className="App">
      <table>
        <tr>
          <th>countries</th>
          <th>enabled</th>
          <th>pending</th>
        </tr>
        {Object.entries(countdetails[0].enabled).map(
          ([country, enabledCount]) => (
            <tr key={country}>
              <td>{country}</td>
              <td>{enabledCount}</td>
              <td>{countdetails[0].pending[country]}</td>
            </tr>
          )
        )}
      </table>
    </div>
  );
}

这段代码的输出将类似于您期望的输出。

输出的屏幕截图:
如何在React中以表格形式显示嵌套对象数组。

英文:

Here is the code to achieve your output:

Link: https://codesandbox.io/s/stackoverflow-solution-jgz6nw

Full code:

var countdetails = [
{
enabled: { IN: 354, MY: 181 },
pending: { IN: 34, MY: 11 },
total: { IN: 388, MY: 192 }
}
];
export default function App() {
return (
&lt;div className=&quot;App&quot;&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;countries&lt;/th&gt;
&lt;th&gt;enabled&lt;/th&gt;
&lt;th&gt;pending&lt;/th&gt;
&lt;/tr&gt;
{Object.entries(countdetails[0].enabled).map(
([country, enabledCount]) =&gt; (
&lt;tr key={country}&gt;
&lt;td&gt;{country}&lt;/td&gt;
&lt;td&gt;{enabledCount}&lt;/td&gt;
&lt;td&gt;{countdetails[0].pending[country]}&lt;/td&gt;
&lt;/tr&gt;
)
)}
&lt;/table&gt;
&lt;/div&gt;
);
}

This code output will looks like your expected output.

Screenshot of output:
如何在React中以表格形式显示嵌套对象数组。

答案3

得分: 0

你的数据由于其不规则的结构而难以映射。
如果你真的想要映射那些数据
这里是你需要的

 <table>
    <tr>
        <td>国家</td>
        <td>启用</td>
        <td>待处理</td>
    </tr>
    {countdetails.map((e, index) => (
        <>

            <tr>
                {Object.keys(e.enabled).map((a, i) => {
                    return (
                        <tr>{a}</tr>
                    )
                })}

                <td>{Object.values(e.enabled).map((a, i) => {
                    return (
                        <tr>{a}</tr>
                    )
                })}</td>

                <td>
                    {Object.values(e.pending).map((a, i) => {
                        return (
                            <tr>{a}</tr>
                        )
                    })}
                </td>

            </tr>
        </>
    ))}
</table>

希望这有所帮助。

英文:

Your data is hard to map due to its irregularity structure.
If you really want to map that data
Here you go

 &lt;table&gt;
                            &lt;tr&gt;
                                &lt;td&gt;countries&lt;/td&gt;
                                &lt;td&gt;enabled&lt;/td&gt;
                                &lt;td&gt;pending&lt;/td&gt;
                            &lt;/tr&gt;
                            {countdetails.map((e, index) =&gt; (
                                &lt;&gt;

                                    &lt;tr&gt;
                                        {Object.keys(e.enabled).map((a, i) =&gt; {
                                            return (
                                                &lt;tr&gt;{a}&lt;/tr&gt;
                                            )
                                        })}

                                        &lt;td&gt;{Object.values(e.enabled).map((a, i) =&gt; {
                                            return (
                                                &lt;tr&gt;{a}&lt;/tr&gt;
                                            )
                                        })}
                                        &lt;/td&gt;

                                        &lt;td&gt;
                                            {Object.values(e.pending).map((a, i) =&gt; {
                                                return (
                                                    &lt;tr&gt;{a}&lt;/tr&gt;
                                                )
                                            })}
                                        &lt;/td&gt;
                                       
                                    &lt;/tr&gt;
                                &lt;/&gt;
                            ))}
                        &lt;/table&gt;

Hope this helps.

答案4

得分: 0

在我看来,在这种情况下最好的方法是将其明确表示出来,而不是使用复杂的对象方法。

要么这样,要么转换为更适合表格的数据结构,如之前所述。

var countdetails = [
  {
    enabled: { IN: 354, MY: 181 },
    pending: { IN: 34, MY: 11 },
    total: { IN: 388, MY: 192 }
  }
];

export default function App() {
  return (
    <div className="App">
      <table>
        {countdetails.map((e) => (
          <>
            <tr>
              <td>countries</td>
              <td>enabled</td>
              <td>pending</td>
            </tr>
            <tr>
              <td>IN</td>
              <td>{e.enabled.IN}</td>
              <td>{e.pending.IN}</td>
            </tr>
            <tr>
              <td>MY</td>
              <td>{e.enabled.MY}</td>
              <td>{e.pending.MY}</td>
            </tr>
          </>
        ))}
      </table>
    </div>
  );
}
英文:

In my opinion it is better to just spell it out in this case. Instead of using fancy Object methods.

Either this or convert to data structure more suitable for tables as described here earlier.

var countdetails = [
{
enabled: { IN: 354, MY: 181 },
pending: { IN: 34, MY: 11 },
total: { IN: 388, MY: 192 }
}
];
export default function App() {
return (
&lt;div className=&quot;App&quot;&gt;
&lt;table&gt;
{countdetails.map((e) =&gt; (
&lt;&gt;
&lt;tr&gt;
&lt;td&gt;countries&lt;/td&gt;
&lt;td&gt;enabled&lt;/td&gt;
&lt;td&gt;pending&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IN&lt;/td&gt;
&lt;td&gt;{e.enabled.IN}&lt;/td&gt;
&lt;td&gt;{e.pending.IN}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MY&lt;/td&gt;
&lt;td&gt;{e.enabled.MY}&lt;/td&gt;
&lt;td&gt;{e.pending.MY}&lt;/td&gt;
&lt;/tr&gt;
&lt;/&gt;
))}
&lt;/table&gt;
&lt;/div&gt;
);
}

答案5

得分: 0

正如Lin Du的回答中所提到的,建议将您的数据转换成更适合用于呈现UI表格数据的形式。

如果您无法控制数据且数据来自外部源,那么您可以按照以下方式转换数据:

// 转换函数
const transformData = (data) => {
  let result = [];

  // 遍历数据中的每个项目(这里只有一个项目,但可能会有更多)
  for (let item of data) {

    // 遍历“enabled”、“pending”、“total”的每个属性,它们是国家代码
    for (let country in item.enabled) {
      let obj = {};

      // 当前国家代码用于在“enabled”、“pending”、“total”对象中查找值
      obj['countries'] = country;
      obj['enabled'] = item.enabled[country];
      obj['pending'] = item.pending[country];
      obj['total'] = item.total[country]; // 在这里包括了“total”

      // 每个构造的对象都被推入结果数组中
      result.push(obj);
    }
  }

  return result;
};

var countdetails = [
  {
    enabled: { IN: 354, MY: 181 },
    pending: { IN: 34, MY: 11 },
    total: { IN: 388, MY: 192 },
  },
];

const dataSource = transformData(countdetails);

console.log(dataSource);
// 现在它还包括“total”:
// [
//   {
//     countries: 'IN',
//     enabled: 354,
//     pending: 34,
//     total: 388
//   },
//   {
//     countries: 'MY',
//     enabled: 181,
//     pending: 11,
//     total: 192
//   }
// ]

现在使用这个转换后的数据来构建您的表格。

英文:

As mentioned in Lin Du's answer, it is advised to transform your data more suitable to render table data for UI.

In case you don't have control over data and it is from external source, then you can transform your data as below

// Transform function
const transformData = (data) =&gt; {
  let result = [];

  // Loop over each item in data (here it&#39;s only one item but could be more)
  for (let item of data) {

    // Iterate over each property in &#39;enabled&#39;, &#39;pending&#39;, &#39;total&#39; which are country codes
    for (let country in item.enabled) {
      let obj = {};

      // The current country code is used to look up values in the &#39;enabled&#39;, &#39;pending&#39;, &#39;total&#39; objects
      obj[&#39;countries&#39;] = country;
      obj[&#39;enabled&#39;] = item.enabled[country];
      obj[&#39;pending&#39;] = item.pending[country];
      obj[&#39;total&#39;] = item.total[country]; // Included &#39;total&#39; here

      // Each constructed object is pushed into the result array
      result.push(obj);
    }
  }

  return result;
};

var countdetails = [
  {
    enabled: { IN: 354, MY: 181 },
    pending: { IN: 34, MY: 11 },
    total: { IN: 388, MY: 192 },
  },
];

const dataSource = transformData(countdetails);

console.log(dataSource);
// Now it will include &#39;total&#39; also:
// [
//   {
//     countries: &#39;IN&#39;,
//     enabled: 354,
//     pending: 34,
//     total: 388
//   },
//   {
//     countries: &#39;MY&#39;,
//     enabled: 181,
//     pending: 11,
//     total: 192
//   }
// ]

Now use this transformed data to build your table

huangapple
  • 本文由 发表于 2023年7月13日 17:42:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/76677993.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定