如何在javascript es6/2015中从解析对象中创建具有唯一键的映射

how to create a map with unique keys from a parsed object in javascript es6/2015?

本文关键字:创建 对象 唯一 映射 一键 javascript es6 2015      更新时间:2023-09-26

假设我收到一个解析后的json,如下所示:

[{"a":1},{"a":2},{"a":3}]

键与a相同。

我如何使每个a唯一,使地图可用?'

EDIT1 :

Results I want:

let myMap = {}; //I declare my variable
//Then I fetch a json and parse it
fetch(link)
    .then(function(response) {
      return response.json(); //parse the json string
    }).then(function(json) {
      myMap = json; //set it to myMap to be used
}

由于某种原因,我有重复的键,虽然你们说json是唯一的。我是否必须先将json字符串设置为myMap,然后只解析它?

基本上你可以使用Object作为哈希表

var data = [{ "a": 1 }, { "a": 2 }, { "a": 3 }],
    object = Object.create(null);
data.forEach(function (el) {
    object[el.a] = el;
});
console.log(object);

Map

var data = [{ "a": 1 }, { "a": 2 }, { "a": 3 }],
    map = new Map;
data.forEach(function (el) {
    map.set(el.a, el);
});
console.log(map.get(1));

Map相对于Object的优点是,键可以是任何东西。键不转换为字符串。映射可以使用对象或其他基本值或非基本值作为键

如果你有一个单一的值列表,或者想要确保它是唯一的,你可以使用这样提供的索引:

obj.map((item, index) => 
   ...
)}

也许是这个?

[{a:1},{a:2},{a:3}].map(function(item, index) { item.id = index; return item; });

javascript中的Map不需要唯一的id,它将遍历所有的值。它会遍历所有对象不管键是否相同

,

var kvArray = [{key:1, value:10}, {key:2, value:20}, {key:3, value: 30}]
var reformattedArray = kvArray.map(function(obj){ 
var rObj = {};
  rObj[obj.key] = obj.value;
   return rObj;
});

好吧,[{a:1},{a:2},{a:3}]已经是独一无二的…但是,它是一个数组。所以你不能直接访问对象{a:2, ...},而是通过循环找到索引。

如果我对你的问题理解正确的话……您想用唯一键a创建新的MAP,这样如何?-减少可以帮助我们。:)

顺便说一句,Nina Scholz的答案是正确的。

let myMap = {}; //I declare my variable
//Then I fetch a json and parse it
fetch(link)
    .then(function(response) {
      return response.json(); //parse the json string
    }).then(function(json) {
      // myMap = json; //set it to myMap to be used
      myMap = json.reduce(function(p, n) { p[n.a] = n; return p; }, {});
      // n.a or n['a'] - primary key (in sample, [1,2,3...])
      // "myMap[1].foo", "myMap[2].bar"
      // or change KEY as your taste.
      myMap = json.reduce(function(p, n) { p['k' + n.a] = n; return p; }, {});
      // "myMap.k1.foo", "myMap.k2.bar"
      // It's unique but if you want everything...
      myMap = json.reduce(function(p, n) {
        var k = 'k' + n.a;
        if(p[k] !== undefined) { p[k] = n; }
        else if(Array.isArray(p[k])) { p[k].push(n); }
        else { p[k] = [p[k]] ; }
        return p;
      }, {});
}