javascript - 深度扩展,扩展到对象数组?

标签 javascript

我想知道这样的事情是否可能 - 一个查看对象数组的扩展

假设我有:

 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"]}
   ]

这就像扩展一样,如果那里没有对象,它只会创建一个。这样的事情可能吗?谢谢!

最佳答案

看起来你想要这样的东西:

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>

此函数的工作原理是按名称查找现有条目(如果存在)。如果没有,我们只需将要合并的对象作为新条目推送即可。

如果该条目确实存在,请查找两组项目之间的差异,然后将它们连接到现有数组的末尾(并对结果进行排序)。

这对于您的数据结构来说非常具体,并不是世界上最灵活的解决方案,但希望能够很好地展示算法。

关于javascript - 深度扩展,扩展到对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28902650/

相关文章:

Javascript的几个键盘事件

javascript - 小屏幕的 HTML 高度/宽度属性覆盖

javascript - Sharepoint SOAP 请求,如何设置下拉字段?

javascript - 如何更改网页上 "text-selection"光标的外观或在所有主流浏览器中选择文本时禁用光标更改?

javascript - 我脚本中的 Localstorage 似乎不起作用

javascript - Redux 存储更改后 React 组件不会更新

javascript - 拉力赛标签云

javascript - IoT/WinJS/VS - 无法创建 Web 诊断对象

javascript - 可以从 $window.onerror 捕获 Angular 应用程序中的 JavaScript 错误

javascript - Cordova 检查 url 中的文件是否存在