相关疑难解决方法(0)

在JavaScript中深度克隆对象的最有效方法是什么?

克隆JavaScript对象的最有效方法是什么?我已经看到obj = eval(uneval(o));被使用,但这是非标准的,只有Firefox支持.

我做过类似的事情,obj = JSON.parse(JSON.stringify(o));但质疑效率.

我也看到了具有各种缺陷的递归复制功能.
我很惊讶没有规范的解决方案.

javascript clone object

5181
推荐指数
48
解决办法
189万
查看次数

如何动态合并两个JavaScript对象的属性?

我需要能够在运行时合并两个(非常简单的)JavaScript对象.例如,我想:

var obj1 = { food: 'pizza', car: 'ford' }
var obj2 = { animal: 'dog' }

obj1.merge(obj2);

//obj1 now has three properties: food, car, and animal
Run Code Online (Sandbox Code Playgroud)

有没有人有这个脚本或知道内置的方法来做到这一点?我不需要递归,我不需要合并函数,只需要平面对象上的方法.

javascript javascript-objects

2338
推荐指数
33
解决办法
122万
查看次数

如何在JavaScript中合并两个数组并重复删除项目

我有两个JavaScript数组:

var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];
Run Code Online (Sandbox Code Playgroud)

我希望输出为:

var array3 = ["Vijendra","Singh","Shakya"];
Run Code Online (Sandbox Code Playgroud)

输出数组应该删除重复的单词.

如何在JavaScript中合并两个数组,以便我只按照它们插入原始数组的相同顺序从每个数组中获取唯一项?

javascript arrays merge

1256
推荐指数
34
解决办法
100万
查看次数

从JS数组中删除重复值

我有一个非常简单的JavaScript数组,可能包含也可能不包含重复项.

var names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"];
Run Code Online (Sandbox Code Playgroud)

我需要删除重复项并将唯一值放在一个新数组中.

我可以指出我尝试过的所有代码,但我认为它没用,因为它们不起作用.我也接受jQuery解决方案.

类似的问题:

javascript arrays unique duplicates

1225
推荐指数
28
解决办法
130万
查看次数

获取Javascript变量类型的更好方法是什么?

有没有更好的方法来获取JS中的变量类型typeof?当你这样做时它工作正常:

> typeof 1
"number"
> typeof "hello"
"string"
Run Code Online (Sandbox Code Playgroud)

但是当你尝试时它没用了:

> typeof [1,2]
"object"
>r = new RegExp(/./)
/./
> typeof r
"function"
Run Code Online (Sandbox Code Playgroud)

我知道instanceof,但这要求你事先知道这种类型.

> [1,2] instanceof Array
true
> r instanceof RegExp
true
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

javascript types typeof

246
推荐指数
7
解决办法
32万
查看次数

两个对象之间的通用深度差异

我有两个对象:oldObjnewObj.

数据oldObj用于填充表单,newObj是用户更改此表单中的数据并提交数据的结果.

两个对象都很深,即.它们具有对象或对象数组等属性 - 它们可以是n级深度,因此diff算法需要是递归的.

现在我需要不只是从弄清楚什么改变(如添加/更新/删除)oldObjnewObj,却怎么也最能代表它.

到目前为止,我的想法只是构建一个genericDeepDiffBetweenObjects方法,它将返回表单上的对象,{add:{...},upd:{...},del:{...}}但后来我想:其他人必须先需要它.

那么......有没有人知道一个库或一段代码可以做到这一点,并且可能有更好的方式来表示差异(以一种仍然是JSON可序列化的方式)?

更新:

我想到了一种更好的方式来表示更新的数据,使用相同的对象结构newObj,但将所有属性值转换为表单上的对象:

{type: '<update|create|delete>', data: <propertyValue>}
Run Code Online (Sandbox Code Playgroud)

所以,如果newObj.prop1 = 'new value'oldObj.prop1 = 'old value'它会设置returnObj.prop1 = {type: 'update', data: 'new value'}

更新2:

当我们得到数组的属性时,它会变得非常毛茸茸,因为数组[1,2,3]应该被计算为等于[2,3,1],这对于基于值的类型的数组(如string,int和bool)来说非常简单,但是当涉及到它时,它实际上很难处理引用类型的数组,如对象和数组.

应该找到的示例数组相等:

[1,[{c: 1},2,3],{a:'hey'}] and [{a:'hey'},1,[3,{c: 1},2]]
Run Code Online (Sandbox Code Playgroud)

检查这种类型的深度值相等不仅非常复杂,而且还要找出一种表示可能的变化的好方法.

javascript compare object

194
推荐指数
12
解决办法
13万
查看次数

当然ES6 +必须有一种方法将两个javascript对象合并在一起,它是什么?

我厌倦了总是不得不写这样的代码:

function shallowExtend(obj1,obj2){
  var key;
  for ( key in obj2 ) {
    if ( obj2.hasOwnProperty(key) === false )  continue;
    obj1[key] = obj2[key]
  }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果我不想自己编写代码,请实现一个已经完成的代码库.当然ES6 +即将救援上,这将提供给我们的东西,如一个Object.prototype.extend(obj2...)Object.extend(obj1,obj2...)

那么ES6 +提供这样的功能呢?如果还没有,那么这样的功能是否有计划?如果没有计划,为什么不呢?

javascript ecmascript-6

134
推荐指数
6
解决办法
8万
查看次数

使用扩展语法在ES6中进行深层复制

我正在尝试为我的Redux项目创建一个深度复制映射方法,该方法将使用对象而不是数组.我读到在Redux中,每个州都不应该改变以前的状态.

export const mapCopy = (object, callback) => {
    return Object.keys(object).reduce(function (output, key) {

    output[key] = callback.call(this, {...object[key]});

    return output;
    }, {});
}
Run Code Online (Sandbox Code Playgroud)

有用:

    return mapCopy(state, e => {

            if (e.id === action.id) {
                 e.title = 'new item';
            }

            return e;
        })
Run Code Online (Sandbox Code Playgroud)

但是它没有深层复制内部项目所以我需要调整它:

export const mapCopy = (object, callback) => {
    return Object.keys(object).reduce(function (output, key) {

    let newObject = {...object[key]};
    newObject.style = {...newObject.style};
    newObject.data = {...newObject.data};

    output[key] = callback.call(this, newObject);

    return output;
    }, {});
}
Run Code Online (Sandbox Code Playgroud)

这不太优雅,因为它需要知道传递了哪些对象.ES6中是否有一种方法可以使用扩展语法来深度复制对象?

javascript ecmascript-6 spread-syntax redux

79
推荐指数
6
解决办法
8万
查看次数

Object.assign vs $ .extend

鉴于我使用的是不可变对象,我想克隆复制一个对象以进行更改.

现在我一直在使用javascript的本机,Object.assign但偶然发现了JQuery $.extend.

我想知道更好的方法是什么,两者之间的区别究竟是什么?看看文档,我似乎无法真正找到有关为何选择其中任何一个的可见差异.

javascript jquery

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

Object.assign-override嵌套属性

我有一个a这样的对象:

const a = {
  user: {
   …
   groups: […]
   …
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,有更多的属性 a.user

我想只改变a.user.groups价值.如果我这样做:

const b = Object.assign({}, a, {
  user: {
    groups: {}
  }
});
Run Code Online (Sandbox Code Playgroud)

b没有任何其他财产,除了b.user.groups,所有其他财产都被删除.是否有任何ES6方式只能更改嵌套属性,而不会丢失所有其他属性Object.assign

javascript ecmascript-6

45
推荐指数
4
解决办法
3万
查看次数