标签: javascript-objects

JavaScript,覆盖对象而不会丢失引用

应用

我正在开发一个构建在AngularJS之上的简单Web应用程序.该应用程序应该能够脱机工作以及在线工作.当用户离线时,对数据的更改将存储在本地.因此,在离线模式下此应用程序中使用的id只是临时id,在上传到服务器时会被替换

问题

应用程序中使用的数据由复杂对象组成(具有对其他对象的关系/引用).当我保存到服务器时,我希望视图能够使用新的"真实"ID进行更新.但是,由于JavaScript使用对象作为引用,因此无法执行我想要的操作:$scope.data = newdata 这不会覆盖$ scope.data,而是创建一个新对象.旧数据的旧引用仍然存在.

简化示例

var x = {id: 1, name: "myObject"}
var c = x    // c = {id: 1, name: "myObject"}
x = {id: 2, name: "myNewObject"} 
// c = {id: 1, name: "myObject"}
Run Code Online (Sandbox Code Playgroud)

如您所见,c仍然是对旧对象的引用.实际上,这会导致我的视​​图没有使用新数据更新,因为它仍然绑定到旧数据.我需要的是覆盖在这个例子中x的属性.我需要以递归方式执行此操作,因为我的实际对象很复杂,但是它不应该输入任何循环引用,因为这可能会导致堆栈溢出.如果我用b覆盖a并且a具有b未获得的属性,则应删除这些属性.

我需要的

我需要某种功能,用b(新对象)中的属性覆盖(旧对象)中的所有属性.应删除存在于但不存在于b中的所有属性.

javascript javascript-objects

12
推荐指数
3
解决办法
1万
查看次数

在数组中查找对象并从中获取值以显示在选择列表中

我有一个字符串值(例如"表1"),我需要用它来查找数组中的特定对象,如下所示:

[
 {
  lookups: [], 
  rows: [{data: {a: 1, b: 2}}, {data: {a: 3, b: 4}}], 
  title: "Table 1", 
  columns: [{name: "a"}, {name: "b"}]
 },
 {
  lookups: [],
  rows: [{data: {c: 5, d: 6}}, {data: {c: 7, d: 8}}],
  title: "Table 2",
  columns: [{name: "c"}, {name: "d"}]
 }
]
Run Code Online (Sandbox Code Playgroud)

一旦找到该对象,我就需要从列键中取值并将它们显示在选择列表中.

我知道如何做第二部分,但它首先是我遇到麻烦的对象访问.我试图在React组件渲染中执行此操作.

任何有关这方面的帮助将不胜感激.

谢谢你的时间.

arrays javascript-objects reactjs

12
推荐指数
2
解决办法
5万
查看次数

导航到Javascript对象中的上一个和下一个项目

我想在给定对象项目的情况下向上和向下导航JavaScript对象.一个示例对象:

var items = {
   "5" : ["name", "link2"],
   "8" : ["name 2", "link 2"],
   "11" : ["name 3", "link 3"]
}
Run Code Online (Sandbox Code Playgroud)

现在,鉴于我有这个项目items["8"].我想分别得到上一个和下一个项目.

getItemBefore = function(index) {
    // index holds 8
    // should return "5"
}

getItemAfter = function(index) {
    // index hold 8
    // should return 11
}
Run Code Online (Sandbox Code Playgroud)

我该如何获得这些物品?

javascript javascript-objects

11
推荐指数
2
解决办法
1万
查看次数

使用JavaScript以递归方式从对象中删除属性和值的最快方法是什么?

我需要找到$meta从对象中删除所有属性及其值的最快方法,例如:

{
  "part_one": {
    "name": "My Name",
    "something": "123",
    "$meta": {
      "test": "test123"
    }
  },
  "part_two": [
    {
      "name": "name",
      "dob": "dob",
      "$meta": {
        "something": "else",
        "and": "more"
      }
    },
    {
      "name": "name",
      "dob": "dob"
    }
  ],
  "$meta": {
    "one": 1,
    "two": 2
  }
}
Run Code Online (Sandbox Code Playgroud)

应该成为以下内容,因为$meta属性可能位于对象中的任何位置,因此可能需要某种形式的递归.

{
  "part_one": {
    "name": "My Name",
    "something": "123"
  },
  "part_two": [
    {
      "name": "name",
      "dob": "dob"
    },
    {
      "name": "name",
      "dob": "dob"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

任何帮助或建议将不胜感激!

谢谢!

javascript recursion object javascript-objects

11
推荐指数
3
解决办法
9386
查看次数

如何在原型继承中创建新对象时覆盖函数?

这篇博文中,我们有一个JavaScript原型继承的例子:

var human = {
    name: '',
    gender: '',
    planetOfBirth: 'Earth',
    sayGender: function () {
        alert(this.name + ' says my gender is ' + this.gender);
    },
    sayPlanet: function () {
        alert(this.name + ' was born on ' + this.planetOfBirth);
    }
};

var male = Object.create(human, {
    gender: {value: 'Male'}
});

var female = Object.create(human, {
    gender: {value: 'Female'}
});

var david = Object.create(male, {
    name: {value: 'David'},
    planetOfBirth: {value: 'Mars'}
});

var jane = Object.create(female, {
    name: {value: …
Run Code Online (Sandbox Code Playgroud)

javascript inheritance javascript-objects

11
推荐指数
2
解决办法
508
查看次数

理解typescript生成的__extends函数?

我正在玩Typescript并试图理解编译器生成的已编译的Javascript代码

打字稿代码:

class A { }
class B extends A { }
Run Code Online (Sandbox Code Playgroud)

生成的Javascript代码:

var __extends = (this && this.__extends) || (function () {
    var extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null …
Run Code Online (Sandbox Code Playgroud)

javascript prototype javascript-objects proto javascript-inheritance

11
推荐指数
1
解决办法
2702
查看次数

在JavaScript中更改对象的类型

我有一个用JSON定义的现有对象数组.对象显然是Object类型.如何将它们与自定义对象类型相关联以为其提供特定功能?

javascript javascript-objects

10
推荐指数
1
解决办法
1万
查看次数

使用Object.create的优点

此问题类似但不同.以下代码来自JavaScript:The Definitive Guide.他基本上定义了一个继承方法,如果它存在则遵循Object.create,否则使用构造函数和交换原型进行普通的旧Javascript继承.

我的问题是,由于Object.create在很多常见的 IE 浏览器中都不存在,甚至试图使用它有什么意义呢?它肯定会使代码混乱,上一个问题的一位评论者提到Object.create 并不是太快.

那么尝试添加额外代码以便偶尔使用这个ECMA 5函数有什么优势呢?这个函数可能会或者可能不会比这种"旧"方式慢?

function inherit(p) {
   if (Object.create) // If Object.create() is defined...
      return Object.create(p); // then just use it.

   function f() {}; // Define a dummy constructor function.
   f.prototype = p; // Set its prototype property to p.
   return new f(); // Use f() to create an "heir" of p.
}
Run Code Online (Sandbox Code Playgroud)

javascript javascript-objects ecmascript-5 object-create

10
推荐指数
1
解决办法
1736
查看次数

主要javascript引擎中JavaScript关联数组(动态对象属性)中检索/插入的复杂性是多少?

请使用以下代码示例:

var myObject = {};
var i = 100;

while (i--) {
    myObject["foo"+i] = new Foo(i);
}

console.log(myObject["foo42"].bar());
Run Code Online (Sandbox Code Playgroud)

我有几个问题.

主要引擎(IE,Mozilla,Chrome,Safari)使用什么样的数据结构来存储键值对?我希望它是一种二进制搜索树,但我认为它们可能会使用链表(因为迭代是按插入顺序完成的).

如果他们确实使用搜索树,它是自我平衡的吗?因为具有传统搜索树的上述代码将创建不平衡树,导致用于搜索的O(n)的最坏情况场景,而不是用于平衡树的O(log n).

我只是问这个,因为我将编写一个库,需要从数据结构中有效地检索密钥,虽然我可以实现自己的或现有的红黑树,但我宁愿使用本机对象属性,如果它们是足够有效.

javascript time-complexity javascript-engine javascript-objects data-structures

10
推荐指数
1
解决办法
3434
查看次数

如何检查对象结构是否存在?

让我们说我从第三方源解析一个JSON对象:

var myObject = {
  person_list: [
    { black_hair: {
      list: [
        'bob',
        'john',
        'allen'
      ]}
    }
  ]
};
Run Code Online (Sandbox Code Playgroud)

但是,如果结构突然改变或者数据响应可能已损坏,我该如何检查结构的深度部分是否存在?

我可以

if ( myObject.person_list.black_hair.list !== undefined ) {
  // do stuff
}
Run Code Online (Sandbox Code Playgroud)

black_hair在某些情况下可能不存在.如果它从对象中丢失,那么我得到一个Uncaught TypeError: Cannot read property 'list' of undefined.因此,我能想到检查整个结构是否完整的唯一方法是检查是否定义了每个级别:

if ( myObject.person_list !== undefined ) {
  if ( myObject.person_list.black_hair !== undefined ) {
    if ( myObject.person_list.black_hair.list !== undefined ) {
      // do stuff
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但这有点荒谬.有一种简单的方法可以在JavaScript中处理这个问题吗?是尝试,抓住最好的方法?

javascript json javascript-objects

10
推荐指数
1
解决办法
3773
查看次数