Как go о сопоставлении объекта массива внутри объекта с использованием прототипа? - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть некоторые проблемы с получением функции карты прототипа для работы с моим объектом массива внутри моего объекта. Я получаю ошибку "x () не является функцией". Я знаю, что вы не можете использовать прототип на объектах, но массивы внутри объектов должны быть доступны с помощью obj.arr.map ().

Вот мой код:

let data = [

{'a':1, 'b':2, 'c':3},
{'a':4, 'b':5, 'c':6},
{'a':7, 'b':8, 'c':9}

]

let mapped = data.map(function(data){

  let newMap = {}
  newMap['a']=data['a']
  newMap['b']=data['b']
  return newMap;

});

Mapping.prototype.protoMap = function(){

//I have tried writing it as map.data

  let protoMap = map.map(function(map){

    let protoMap1 = {}

    protoMap1['a'] = map.mappedData['a']

    return protoMap1;

  });

}

function Mapping(data = []){

  this.mappedData = data

};

let map = new Mapping(mapped);

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Старайтесь избегать использования global переменных:

Mapping.prototype.protoMap = function() {
  // DON'T do this
  // plus, this really doesn't make sense
  // because `map` refers to the new `Mapping` object that
  // you created; what you probably want to do is use the `mappedData`
  // property on your newly created `Mapping` object
  // const protoMap = map.mappedData.map(function(map) {...})

  // instead, use `this` to access the `mappedData` property
  // that you passed to the constructor
  const protoMap = this.mappedData.map(function(item) {...})
}
const map = new Mapping(mapped)

См. Комментарии во фрагменте кода, чтобы выяснить, как исправить пример.

function Mapping(data = []) {
  this.mappedData = data
}
Mapping.prototype.protoMap = function() {
  // access the `mappedData` that was passed
  // to the `Mapping` constructor using `this`
  const protoMap = this.mappedData.map(
    function(item) {
      // use `item` argument for the `mappedData.map`
      // callback to access each item inside `mappedData`
      // individually
      const temp = {}
      temp["a"] = item["a"]
      return temp
    }
  )
  return protoMap
}

const data = [
  {'a': 1, 'b': 2, 'c': 3},
  {'a': 4, 'b': 5, 'c': 6},
  {'a': 7, 'b': 8, 'c': 9}
]

const mapped = data.map(
  function(data) {
    const newMap = {}
    newMap['a']=data['a']
    newMap['b']=data['b']
    return newMap;
  }
)

const mapping = new Mapping(mapped)
const result = mapping.protoMap()

console.log('result', result)
0 голосов
/ 09 апреля 2020

Вы можете использовать что-то похожее для конвертации array to map. Я создал эту утилиту давно go.

Больше применений:

https://gist.github.com/deepakshrma/4b6a0a31b4582d6418ec4f76b7439781

class Mapper {
  constructor(array, key) {
    this.map = array.reduce((map, item) => {
      const val = item[key];
      if (!map[val]) {
        map[val] = [];
      }
      map[val].push(item);
      return map;
    }, {});
  }

  find(key) {
    return this.map[key] && this.map[key][Mapper.FIRST_INDEX]; //return blank array
  }

  findAll(key, returnUndefined) {
    //return blank array
    return this.map[key] ? this.map[key] : returnUndefined ? undefined : [];
  }
}

Mapper.FIRST_INDEX = 0;
let data = [
  { a: 1, b: 2, c: 3 },
  { a: 4, b: 5, c: 6 },
  { a: 7, b: 8, c: 9 },
];
var dataMap = new Mapper(data, "a"); 
console.log(dataMap.map); 


if(typeof window !== 'undefined') window.Mapper = Mapper;
...