javascript - 如何使用 id 上匹配的另一个 2D 数组更新 2D 数组

标签 javascript arrays

我有两个列表,希望在匹配的索引上更新一个列表。

let cart = [{
  header: some_data,
  items: [{
    id: 7,
    properties: some_props_7,
    time: 12345
  }, {
    id: 19,
    properties: some_props_19,
    time: 13344
  }, {
    id: 24,
    properties: some_props_24,
    time: 14342
  }]
}, etc.];

let newData = [{
  header: some_data,
  items: [{
    id: 19,
    properties: some_new_props_19,
    time: 17744
  }, {
    id: 24,
    properties: some_new_props_24,
    time: 18342
  }]
}, etc.];

我正在迭代购物车,但没有想出有效的更新方法。我认为我需要在“更新购物车”部分中使用另一个 for 循环,但这对我来说似乎不是最佳的。

k 是索引列表

let i = 0, j = 0, l = cart.length;
for (i = 0; i < l; i++) {
  let m = cart[i]['items'].length;
  for (j = 0; j < m; j++) {
    // update cart index with associated newData matching on id
  }
}

如何从动态 newData 列表更新购物车中的标题和商品数据?

最佳答案

过滤掉重叠并与新项目连接:

let cart = {
	header: 'some_data',
	items: [{
		id: 7,
		properties: 'some_props_7',
		time: 12345
	}, {
		id: 19,
		properties: 'some_props_19',
		time: 13344
	}, {
		id: 24,
		properties: 'some_props_24',
		time: 14342
	}]
};

let newData = {
	header: 'some_data',
	items: [{
		id: 19,
		properties: 'some_new_props_19',
		time: 17744
	}, {
		id: 24,
		properties: 'some_new_props_24',
		time: 18342
	}]
};
//TEST
console.log(
	cart.items.filter(item => !newData.items.map(i => i.id).includes(item.id)).concat(newData.items)
);

针对评论进行了更新

现在它可以正确映射到列表。

var cart = [{
  header: 'some_data',
  items: [{
    id: 7,
    properties: 'some_props_7',
    time: 12345
  }, {
    id: 19,
    properties: 'some_props_19',
    time: 13344
  }, {
    id: 24,
    properties: 'some_props_24',
    time: 14342
  }]
}];
var newData = [{
  header: 'some_data',
  items: [{
    id: 19,
    properties: 'some_new_props_19',
    time: 17744
  }, {
    id: 24,
    properties: 'some_new_props_24',
    time: 18342
  }]
}];
//TEST
cart = cart
  //Modify existing data elements
  .map(function(car) {
    newData.forEach(function(data) {
      if (data.header === car.header) {
        car.items = car.items.filter(function(item) {
          return !data.items.map(function(i) {
            return i.id;
          }).includes(item.id);
        }).concat(data.items);
      }
    });
    return car;
  })
  //Add new data elements
  .concat(newData.filter(function(data) {
    return !cart.some(function(car) {
      return car.header === data.header;
    });
  }));
console.log(cart);

关于javascript - 如何使用 id 上匹配的另一个 2D 数组更新 2D 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57414442/

相关文章:

C - 访问二维数组槽函数不起作用,崩溃

c++ - C++中的动态整数列表

javascript - 单击交换/切换图像时简单的显示/隐藏切换

javascript - 抓取元素外部紧邻的第一个字符

javascript - React Native 输入字段占位符在 iOS 中不起作用

javascript - Array.fill 中的奇怪行为

python - python 将二维数组合并到列表中

c++ - 如何用-1无循环初始化整个数组

JavaScript:如何在浏览器窗口中找出视点的宽度和高度?

javascript - 是否可以将渲染函数放入 Express 的 for 循环中?