我想用一个对象的唯一值填充一个下拉列表( Select 标记).

这是包含数据的对象:

[
    {
        "code": 1,
        "abbr": "BR",
        "vote": 49277010
    },
    {
        "code": 1,
        "abbr": "BR",
        "vote": 31342051
    },
    {
        "code": 43,
        "abbr": "RS",
        "vote": 3353623
    },
    {
        "code": 31,
        "abbr": "MG",
        "vote": 3037957
    },
    {
        "code": 31,
        "abbr": "MG",
        "vote": 5017922
    },
    {
        "code": 35,
        "abbr": "SP",
        "vote": 2650440
    },
    {
        "code": 42,
        "abbr": "SC",
        "vote": 2603665
    },
    {
        "code": 1,
        "abbr": "BR",
        "vote": 71347057
    },
    {
        "code": 26,
        "abbr": "PE",
       "vote": 2309104
    }
]

下面是我如何获取数据来构建下拉列表:

//initialize the dropdown
var dropdown = d3.select("#sel")

dropdown
    .selectAll('myOptions')
    .data(data)
    .enter()
    .append('option')
    .text(function (d) { return d.abbr; }) //text showed in the options
    .attr("value", function (d) { return d.code; }) //values returned by each option

问题是,每个代码/缩写都会显示重复的值,而不是仅显示一个值,如下所示:

<select id="sel">
  <option value="1">BR</option>
  <option value="1">BR</option>
  <option value="43">RS</option>
  <option value="31">MG</option>
  <option value="31">MG</option>
  <option value="35">SP</option>
  <option value="42">SC</option>
  <option value="1">BR</option>
  <option value="26">PE</option>
</select>

如何过滤数据,使其在选项中只有唯一的值?

<select id="sel">
  <option value="1">BR</option>
  <option value="43">RS</option>
  <option value="31">MG</option>
  <option value="35">SP</option>
  <option value="42">SC</option>
  <option value="26">PE</option>
</select>

== EDIT ==

我可以使用set获得unique,如下所示:

const selectedData = [... new Set(data.map(d => d.abbr))].sort();

但是我只能和abbr人一起工作.我怎么也能拿到code分呢?

try 了[... new Set(data.map(d => [d.abbr, d.code))]次,但没有成功,因为这会再次创建包含所有未过滤数据的数组对象.

推荐答案

d3 v7中新增的是flatGroup,它将返回一个数组,其中包含codeabbr的唯一对以及关联的数组对象:

d3.flatGroup(data, d => d.code, d => d.abbr);

如果使用的是早期版本,则可以使用Map获得类似的结果(但without关联的数组对象):

const uniqueData = Array.from(
  data.reduce((a, c) => {
    a.set(c.code, c.abbr);
    return a;
  }, new Map())
);

console.log(uniqueData);

下面的工作示例使用flatGroup:

const uniqueData = d3.flatGroup(data, d => d.code, d => d.abbr);

console.log(uniqueData);

//initialize the dropdown
var dropdown = d3.select("#sel")

dropdown
  .selectAll('myOptions')
  .data(uniqueData)
  .enter()
  .append('option')
  .text(function (d) { return d[1]; }) //text showed in the options
  .attr("value", function (d) { return d[0]; }) //values returned by
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.3.0/d3.min.js"></script>
<select id="sel">
</select>
<script>
const data = [
    {
        "code": 1,
        "abbr": "BR",
        "vote": 49277010
    },
    {
        "code": 1,
        "abbr": "BR",
        "vote": 31342051
    },
    {
        "code": 43,
        "abbr": "RS",
        "vote": 3353623
    },
    {
        "code": 31,
        "abbr": "MG",
        "vote": 3037957
    },
    {
        "code": 31,
        "abbr": "MG",
        "vote": 5017922
    },
    {
        "code": 35,
        "abbr": "SP",
        "vote": 2650440
    },
    {
        "code": 42,
        "abbr": "SC",
        "vote": 2603665
    },
    {
        "code": 1,
        "abbr": "BR",
        "vote": 71347057
    },
    {
        "code": 26,
        "abbr": "PE",
       "vote": 2309104
    }
];
</script>

Javascript相关问答推荐

自定义帖子类型帖子未显示在网站上

我不知道为什么我的JavaScript没有验证我的表单

如何使用侧边滚动按钮具体滚动每4个格?

了解Node.js中的EventEums和浏览器中的addEventEums之间的关系

D3 Scale在v6中工作,但在v7中不工作

如何为我的astro页面中的相同组件自动创建不同的内容?

在react JS中映射数组对象的嵌套数据

用于编辑CSS样式的Java脚本

变量的值在Reaction组件中的Try-Catch语句之外丢失

如何强制Sphinx中的自定义js/css文件始终加载更改而不缓存?

更改预请求脚本中重用的JSON主体变量- Postman

当我在Reaction中创建一个输入列表时,我的输入行为异常

如何在JAVASCRIPT中合并两组对象并返回一些键

如何使用画布在另一个内部绘制一个较小但相同的形状,同时保持恒定的边界厚度?

react -原生向量-图标笔划宽度

无法使用npm install安装react-dom、react和next

谷歌饼图3D切片

为什么这个最小Angular 的Licial.dev设置不起作用?

在范围数组中查找公共(包含)范围

在使用JavaScript以HTML格式显示Google Drive中的图像时遇到问题