克隆JavaScript对象的最有效方法是什么?我已经看到obj = eval(uneval(o));被使用,但这是非标准的,只有Firefox支持.
我做过类似的事情,obj = JSON.parse(JSON.stringify(o));但质疑效率.
我也看到了具有各种缺陷的递归复制功能.
我很惊讶没有规范的解决方案.
我需要能够在运行时合并两个(非常简单的)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数组:
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数组,可能包含也可能不包含重复项.
var names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"];
Run Code Online (Sandbox Code Playgroud)
我需要删除重复项并将唯一值放在一个新数组中.
我可以指出我尝试过的所有代码,但我认为它没用,因为它们不起作用.我也接受jQuery解决方案.
有没有更好的方法来获取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)
有没有更好的办法?
我有两个对象:oldObj和newObj.
数据oldObj用于填充表单,newObj是用户更改此表单中的数据并提交数据的结果.
两个对象都很深,即.它们具有对象或对象数组等属性 - 它们可以是n级深度,因此diff算法需要是递归的.
现在我需要不只是从弄清楚什么改变(如添加/更新/删除)oldObj来newObj,却怎么也最能代表它.
到目前为止,我的想法只是构建一个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'}
当我们得到数组的属性时,它会变得非常毛茸茸,因为数组[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)
检查这种类型的深度值相等不仅非常复杂,而且还要找出一种表示可能的变化的好方法.
我厌倦了总是不得不写这样的代码:
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 +提供这样的功能呢?如果还没有,那么这样的功能是否有计划?如果没有计划,为什么不呢?
我正在尝试为我的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的本机,Object.assign但偶然发现了JQuery $.extend.
我想知道更好的方法是什么,两者之间的区别究竟是什么?看看文档,我似乎无法真正找到有关为何选择其中任何一个的可见差异.
我有一个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 ×10
ecmascript-6 ×3
arrays ×2
object ×2
clone ×1
compare ×1
duplicates ×1
jquery ×1
merge ×1
redux ×1
typeof ×1
types ×1
unique ×1