2016-12-19 2 views
1

Я создал пользовательскую функцию из JS, чтобы при преобразовании объектов в объекты Immutable, тогда результат будет содержать только упорядоченные наборы и карты (вместо списков и карт).Custom fromJS immutablejs issue

Это отлично работает, за исключением случаев, когда ключ в объекте называется длиной. Любые идеи, как исправить проблему?

var imm = require("immutable") 

function fromJS(js) { 
    return typeof js !== 'object' || js === null ? js : 
     Array.isArray(js) ? 
      imm.Seq(js).map(fromJS).toOrderedSet() : 
      imm.Seq(js).map(fromJS).toMap(); 
} 

var output = fromJS({ 
    measurements: { 
     length: 10, 
     weight: 30 
    } 
}).toJS(); 

// output is : 
{ 
    measurements: { 
     0: undefined, 
     1: undefined 
     .... 
     32: undefined 
    } 
} 

ответ

1

погорячился, изменив свойство length к mLength.

Вот это JSBin

ImmutableJS ищет length свойство, чтобы проверить данное значение, является ли array-like объект или нет.

Поскольку ваш measurements объект имеет свойство length, он считает, что этот объект является объектом array-like и продолжает Seq конструкцию, основанную на array-like типа, здесь начинаются проблемы.


Для того, чтобы подтвердить это, here является jsbin, который выводит Map с No.of времени, указанного в длине свойство measurements объекта.