JSON 合并、数组推送和排序和删除双精度
json merge, array push & sort & remove doubles
var d=[
{
'fn':'john',
'en':'doe',
'k':['0','5','44']
},
{
'en':'bark',
'k':[,'25','44']
}
];
合并(d[0],d[1]);应该返回这个:
{
'fn':'john',
'en':'bark',
'k':['0','5','25','44']
}
这是一个常见的合并,唯一的区别是数组如果不同就会被推送(就像 fn 变量一样,它只是被添加,或者像 en 变量一样,它被替换,或者像 k 数组一样,如果它不同,它会被推送)(并同时排序)
编辑 1
为我编写脚本不是我所要求的,我不熟悉"is array"和"hasPropery",因为我不熟悉,我正在寻求方向的帮助,并且我正在使用nodejs,所以jquery是一个禁忌。
编辑 2
这是我用来解决问题的代码,以防有人好奇:
function is(obj, type) {
return Object.prototype.toString.call(obj).slice(8, -1) == type;
}
Array.prototype.unique = function() {
var a=this;
for(var i=0; i<a.length; ++i) {
for(var j=i+1; j<a.length; ++j) {
if(a[i] === a[j])
a.splice(j--, 1);
}
}
return a;
};
Object.prototype.merge = function(b) {
var a=this;
for(var prop in b){
if(is(b[prop],'Array')&&is(a[prop],'Array')){
a[prop]=a[prop].concat(b[prop]).unique().sort(function(a,b){return parseInt(a)-parseInt(b)});
}else{
a[prop]=b[prop];
}
}
return a;
}
d[0].merge(d[1]) 准确地给了我所要求的。
要优化数组合并,您可以先对其进行排序,然后再检查唯一。如果您的对象仅包含基元值或数组,而数组仅包含同一时间的基元,则以下内容将起作用:
var tools = {
merge:function(a,b){
var ret = {},key,i=-1,len=arguments.length;
//as in your example, if both items have a property
// named "en" then the property of the second one is used
while(i++<len){
this._merge(ret,arguments[i]);
}
for(key in ret){
if(this._couldBeArray(ret[key])){
//sort and plice are mutator functions that means
//they will change the object when called.
this._unique(ret[key].sort(this._sortNum));
}
};
return ret;
},
_couldBeArray:function(obj){
return(typeof obj==="object" &&
/Array']$/.test(Object.prototype.toString.call(obj)));
},
_merge:function(a,b){
var key;
for(key in b){
if(b.hasOwnProperty(key)){
if(this._couldBeArray(b[key])){
//assuming it's an array, concat only does a
// shallow copy as well though
a[key]=(a[key])?b[key].concat(a[key]):
(new b[key].constructor()).concat(b[key]);
}else{
a[key]=b[key];
}
}
}
},
_unique:function(arr){
var i=arr.length;
while(i!==0){
//unique assumes your array contains only primitives
// of same type for example: 0 does not equal "0"
if(arr[i]===arr[i-1]){
arr.splice(i,1);
}
i--;
}
if(arr[i]===arr[i+1])
arr.splice(i,1);
},
_sortNum:function(a,b){
return parseInt(a,10)-parseInt(b,10);
}
};
var d=[
{
'fn':'john',
'en':'doe',
'k':['0','5','44']
},
{
'en':'bark',
'k':['25','44']
},
{
'another':'another',
'k':['100','44','45'],
'primitiveArray':[1,2,3]
},
{
'city':'NY',
'primitiveArray':[2,3,4,5]
}
];
console.log(tools.merge.apply(tools,d));
使用 jQuery 的.extend
:
//$.extend(deepCopy,target,object1,object2);
var data = $.extend(true,{},d[0],d[1]);
console.log(data.en);
您可以像这样单独合并内部数组:
data.k=d[0].k.concat(d[1].k).unique();
console.log(data.k.join(","));
其中unique()
是添加到 Array 原型的自定义函数:
Array.prototype.unique = function() {
var a = this.concat();
for(var i=0; i<a.length; ++i) {
for(var j=i+1; j<a.length; ++j) {
if(a[i] === a[j])
a.splice(j--, 1);
}
}
return a;
};
相关文章:
- AngularJS:删除重复的对象并按值对数组进行重新排序
- 在对数组进行排序时删除重复项
- jQueryUI可排序-从可排序列表中删除li
- Magento网站-按选项排序:上下箭头与排序数据绑定,只需删除上下箭头即可
- 无法从jQuery可排序列表中删除新添加的项
- 删除后的剑道网格排序
- JQuery UI:将一个项从非可排序项的可排序项中删除
- CKEDITOR内联在动态创建的元素上(可删除/可排序)
- JSON 合并、数组推送和排序和删除双精度
- 在不删除/附加 DOM 节点的情况下对 DOM 节点进行重新排序
- 如何选择性地禁用可排序的 jQuery UI 的删除
- 如何删除项目的可排序 JQuery
- 删除数组中重复的未排序对象
- Jquery UI 可排序和可删除 - 无法将项目从一个列表克隆到另一个列表
- 删除动态元素并对这些元素的值和 ID 重新排序
- 如何删除空格和重新排序单词
- 如何单击时从排序表标题中删除
- Knockout JS + JQuery UI - 在重新排序后从可观察数组中删除项目的问题
- 如何在删除之前设置 jquery 可排序目标列表的样式
- jquery可排序取消删除基于确认