Javascript ES6 将对象数组拆分为两个不同的对象子数组

Javascript ES6 split object array into two different object subarrays

我有一个对象数组或 json 称为 obj.credits: [],其中包含大约 50 个信用对象。每个信用对象都有一个 cast_id 字段,该字段为 null 或不为 null

我想将所有具有 null cast_id 的对象完全过滤到一个子数组 obj.credits.crew: [] 中,并将所有不具有 null cast_id 的对象完全过滤到另一个子数组 obj.credits.cast: [].

在那之后 obj.credits 应该只包含键 castcrew

以下无效。它创建子数组但不删除原始数组对象

 obj.credits.cast = obj.credits.filter(credit => credit.cast_id != null)
 obj.credits.crew = obj.credits.filter(credit => credit.cast_id == null)

这样,您就不必遍历数组两次来将演员与剧组分开。

const cast = [];
const crew = [];
for (const item of obj.credits){
  if (!item) continue;
  if (item.cast_id) cast.push(item);
  else crew.push(item);
}
obj.credits.cast = cast;
obj.credits.crew = crew;

这不是一个很容易理解的问题。 解决这个问题(可行)的漫长方法是初始化两个新数组(credits.crew 和 credits.cast),遍历主数组检查键是否为空,然后将该记录添加到新阵列之一。 这假设您有对象的写入方法来获取它的值。

您遇到的问题是您表现得好像数组是对象。您只是将属性添加到数组中。如果你想让它成为一个对象,你需要重新考虑你是如何做的。

所以你想要一个包含数组的两个属性的对象的最终输出,所以用一个对象替换obj.credits。

obj.credits = obj.credits.reduce((acc, credit) => {
  if (credit.cast_id != null) acc.cast.push(credit);
  else acc.crew.push(credit);
  return acc;
}, { cast: [], crew: [] });

obj.credits 是一个数组。您不能将 castcrew 属性添加到其中。 所以你可以创建 2 个单独的子数组 -

let cast = obj.credits.filter(credit => credit.cast_id != null)
let crew = obj.credits.filter(credit => credit.cast_id == null)

然后清空obj.credits数组,初始化为对象。然后将这些子数组添加为属性。

obj.credits = {};
obj.credits = {cast, crew};

要从列表中删除所有可迭代元素,请将其长度设置为零。示例如下。

let obj = {}
obj.credits = [
  {cast_id: 1},
  {cast_id: 2},
  {cast_id: null}
]
obj.credits.cast = obj.credits.filter(credit => credit.cast_id != null)
obj.credits.crew = obj.credits.filter(credit => credit.cast_id == null)

// remove all elements from `credits` property of `obj`
obj.credits.length = 0

document.write(JSON.stringify(obj), '<br>')
document.write(JSON.stringify(obj.credits), '<br>')
document.write(JSON.stringify(obj.credits.cast), '<br>')
document.write(JSON.stringify(obj.credits.crew))