【问题标题】:How to update values not present in one array of objects from another array of objects?如何从另一个对象数组更新一个对象数组中不存在的值?
【发布时间】:2019-07-01 07:09:40
【问题描述】:

我有两个包含大量数据的对象数组。 这两个数组的结构是这样的。

arr1 = [
  {x: 1, y: '2018-01-01'}, 
  {x: 2, y: '2018-01-02'},           
  {x: 3, y: '2018-01-03'},
  {x: 5, y: '2018-01-05'},
....
]
arr2 = [
  {x: 1, y: '2018-01-01'}, 
  {x: 2, y: '2018-01-02'},           
  {x: 3, y: '2018-01-03'},
  {x: 4, y: '2018-01-04'},
  {x: 5, y: '2018-01-05'},
  {x: 6, y: '2018-01-08'}
]

我想更新arr2,使其使用仅存在于 arr1 中的值更新对象数组,并删除不存在于 arr1 中的任何值。注意,我想更新原来的 arr2 而不是返回一个新的数组。

我尝试遍历单个数组并删除不存在但不是运气的值。

【问题讨论】:

  • 请添加您的尝试和想要的结果。两个数组的顺序相同吗?
  • 你是否匹配了 x 值并更新了 y 值?
  • 试试这个 - arr2.splice(0, arr2.length, ...arr1);
  • @NinaScholz,数组已排序,因此顺序应该没有问题。
  • @camaulay,不,x 值变化很大,因此不应与 imo 匹配。

标签: javascript arrays


【解决方案1】:

您可以获取地图并从末尾迭代以拼接未知项目或更新更改的值。

var arr1 = [{ x: 1, y: '2018-01-01x' }, { x: 2, y: '2018-01-02' }, { x: 3, y: '2018-01-03' }, { x: 5, y: '2018-01-05' }],
    arr2 = [{ x: 1, y: '2018-01-01' }, { x: 2, y: '2018-01-02' }, { x: 3, y: '2018-01-03' }, { x: 4, y: '2018-01-04' }, { x: 5, y: '2018-01-05' }, { x: 6, y: '2018-01-08' }],
    map = arr1.reduce((m, { x, y }) => m.set(x, y), new Map),
    i = arr2.length;

while (i--) {
    if (map.has(arr2[i].x)) {
        if (map.get(arr2[i].x) !== arr2[i].y) {
            arr2[i].y = map.get(arr2[i].x);
        }
    } else {
        arr2.splice(i, 1);
    }
}

console.log(arr2);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 有没有办法在reduce函数中使用空格分隔键名? map = arr1.reduce((m, { "Two spaces", y }) => m.set("Two spaces", y), new Map) 运行时报错
  • 你需要另一个变量名:map = arr1.reduce((m, { "Two spaces": key, y }) => m.set(key, y), new Map)
  • 如果我想要做的唯一检查是y 列并且x 列之间不需要匹配?
  • 结果应该如何? (这看起来像是一个不同的问题。)
  • 几乎一样。我的意思是,返回 arr2 列 y 匹配但不依赖于列 x
猜你喜欢
  • 2018-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-20
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
相关资源
最近更新 更多