我想知道这样的事情是否可行 - 一个看着对象数组的扩展
让我说我有:
myObj = [
{"name" : "one", "test" : ["1","2"]},
{"name" : "two", "test" : ["1","2"]}
]
我正试图延伸到那个
{"name" : "one" , "test" : ["1","3"]}
结果将是 -
myObj = [
{"name" : "one", "test" : ["1","2", "3"]},
{"name" : "two", "test" : ["1","2"]}
]
这就像延伸一样,如果那里没有物体,它就会创造一个。这样的事情可能吗?谢谢!
答案 0 :(得分:2)
看起来你想要这样的东西:
function deepSetMerge(base, next) {
var dataEntry = base.filter(function(it) {
return it.name === next.name;
})[0];
if (dataEntry) {
var diff = next.test.filter(function(it) {
return dataEntry.test.indexOf(it) === -1;
});
dataEntry.test = dataEntry.test.concat(diff).sort();
} else {
base.push(next);
}
}
var data = [{
"name": "one",
"test": ["1", "2"]
}, {
"name": "two",
"test": ["1", "2"]
}];
var add = {
"name": "one",
"test": ["1", "3"]
};
var obj = {
"name": "totally-unique",
"test": [1, 2, "nine", 17.0]
};
deepSetMerge(data, add);
deepSetMerge(data, obj);
document.getElementById('results').textContent = JSON.stringify(data);
<pre id="results"></pre>
此功能通过按名称查找现有条目(如果存在)来工作。如果没有,我们只是将要合并的对象作为新条目推送。
如果条目确实存在,找到两组项目之间的差异,然后将它们连接到现有数组的末尾(并对结果进行排序)。
这非常特定于您的数据结构,而不是世界上最灵活的解决方案,但希望能够很好地显示算法。
答案 1 :(得分:1)
作为一种通用的扩展实现,这将非常棘手且成本高昂。这就是为什么通常避免深潜。最好知道你的数据模型并以这种方式使用它。
使用您的示例,我将对相关数据模型建立一些假设:
name
属性。test
属性的值是一个数组(使这更容易,但它可能是您使用典型的扩展实现的对象。在这种情况下你可以像这样接近它:
var myObj = [
{name: 'one', test: ['1', '2']},
{name: 'two', test: ['1', '2']}
];
function extendTestValue(data, value) {
var names = data.map(function(item) {
return item.name;
});
var index = names.indexOf(value.name);
if (index < 0) {
data.push(value);
} else {
value.test.forEach(function(item) {
if (data[index].test.indexOf(item) < 0) {
data[index].test.push(item);
}
});
}
return data;
}