【问题标题】:JSON.stringify() - how to know current depth in replacerJSON.stringify() - 如何知道替换器的当前深度
【发布时间】:2016-07-30 06:55:23
【问题描述】:

我在尝试对对象进行字符串化时遇到递归问题。

我想知道在替换器中迭代槽键 -> 值时是否有人知道当前深度是多少? 我想用它的 ID 替换一个引用,但只有在我处于特定深度时。

这是一个极简主义的例子:

var a = {
  id: 'idOfA',
  linkedItems: []
};

var b = {
  id: 'idOfB',
  linkedItems: []
};

var c = {
  id: 'idOfC',
  linkedItems: []
};

a.linkedItems.push({
  from: 0,
  to: 0,
  item: b
});
b.linkedItems.push({
  from: 0,
  to: 0,
  item: a
}, {
  from: 0,
  to: 0,
  item: c
});
c.linkedItems.push({
  from: 0,
  to: 0,
  item: a
}, {
  from: 0,
  to: 0,
  item: b
});

var obj = {
  things: {},
  otherThings: {},
  items: [a, b, c]
};

从 obj 开始,我需要用它们的 id 替换“linkedItems”属性中的每个引用。 我强硬的更简单的方法是先将其字符串化... :)

【问题讨论】:

  • 写相关代码..写下你的尝试
  • 显示你的输入数据
  • “替换器”实际上只是一种过滤机制,它不计算被字符串化对象的深度。
  • 抱歉,恭喜您成为世界上为数不多的利用替换器的人之一,这是一个未被充分利用的功能,但在这里对您没有帮助。
  • @AbdennourTOUMI 要求尝试是没有意义的。替换器要么可以访问当前深度,要么不能。在这种特殊情况下,它不能。

标签: javascript json parsing


【解决方案1】:

我假设你所谓的“引用”(a,b & c)是 String 。

var a="SA", b="SB", c="SC" ;

var obj = {
  things: {},
  otherThings: {},
  items: {
    a: {
      _id: 'idOfA',
      linkedItems: [b, c]
    },
    b: {
      _id: 'idOfB',
      linkedItems: [a]
    },
    c: {
      _id: 'idOfC',
      linkedItems: [a, b]
    }
  }
}
function getID(attr){
   var mapping={'SA':'a','SB':'b','SC':'c'};
   return obj.items[mapping[attr]]._id;
   

};

Object.keys(obj.items).map((value, index) =>{
  obj.items[value].linkedItems = obj.items[value].linkedItems.map((e)=>getID(e));
});

console.log(obj)

【讨论】:

  • 对不起,但我看不到任何可能的方法来适应我的需要:s。您可以查看我的第一篇文章了解更多详细信息:)
【解决方案2】:

我终于找到了办法。但我不确定这是不是最好的方法:s。

这是我添加的内容:

Object.defineProperty(Object.prototype, 'map', {
    value: function (f, ctx) {
        ctx = ctx || this;
        var self = this;
        var result = {};
        Object.keys(self).forEach(function (k) {
            result[k] = f.call(ctx, self[k], k, self);
        });

        return result;
    }
});

var okayItems = obj.items.map(function (item, index) {
    item = Object.assign({}, item, {
        linkedItems: item.linkedItems.map(function (linkedItem) {
            linkedItem = linkedItem.map(function (value, key) {
                return (key === 'item') ? value.id : value;
            });

            return linkedItem;
        })
    });

    return item;
});

【讨论】:

    【解决方案3】:

    您可以在您的对象中实现toJson 函数,并在其中处理这种情况,然后当您调用JSON.stringify 时,它将从该对象返回。

    Difference between toJSON() and JSON.Stringify()

    【讨论】:

    • 我已经尝试过这个:)。问题是即使在我的对象中不够深的项目上,它也会始终返回 id。
    猜你喜欢
    • 2023-02-13
    • 1970-01-01
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 2019-12-18
    • 2010-10-25
    相关资源
    最近更新 更多