从数组中的嵌套对象中删除对象 属性

Remove object property from the nested object in the array

我有以下书籍。我想要一个函数来接收目标书和语言,从嵌套对象中删除那本书(键,值)和 returns 新数组。

let books = [
  {
    language: 'spanish',
    books: {
      book_1: 'book1_spanish',
      book_2: 'book2_spanish',
      book_3: 'book3_spanish'
    }
  },
  {
    language: 'italian',
    books: {
      book_1: 'book1_italian',
      book_2: 'book2_italian',
      book_3: 'book3_italian'
    }
  }
];

let targetBook = { book_1: 'book1_spanish' };
let language = 'spanish';

我卡在循环嵌套对象上了。

function removeTargetBook(lan, target) {
  return books.map(book => {
    if (book.language == lan) {
      Object.values(book).map(value => {});
    }
  });
}

它应该 return 没有 book_1 的同一个数组:'book1_spanish'。 这是我的 stackblitz:https://stackblitz.com/edit/js-yxcrbq

谢谢。

我觉得这样的东西应该行得通

function removeTargetBook(lan, target) {
  books.some(book => {
    if (book.language == lan) {
      delete book.books[Object.keys(target)[0]];
      return true;
    }
  });
  return books
}

我的版本太复杂了:

let books = [{
    language: 'spanish',
    books: {
      book_1: 'book1_spanish',
      book_2: 'book2_spanish',
      book_3: 'book3_spanish'
    }
  },
  {
    language: 'italian',
    books: {
      book_1: 'book1_italian',
      book_2: 'book2_italian',
      book_3: 'book3_italian'
    }
  }
];

let targetBook = {
  book_1: 'book1_spanish'
};
let language = 'spanish';

function removeTargetBook(lan, target) {
  return books.map(book => {
    if (book.language === lan) {

      return {
        language: book.language,
        books: Object.assign(...Object.keys(book.books).map((key) => ({
          [key]: book.books[key]
        })).filter((e) => (Object.keys(e)[0] !== Object.keys(target)[0]) && Object.values(e)[0] !== Object.values(target)[0])),
      }
    } else {
      return book
    }
  })
}
console.log(removeTargetBook(language, targetBook))

您想使用 delete 运算符。

我冒昧地稍微扩展了您的代码,以向您展示如何在 forEach 循环中使用对象的 key 比进行键/值对比较更有效。另请注意,我完整地保留了原始 books 对象,这对于单元可测试代码和数据完整性很重要,但您可以根据需要 change/implement。

let books = [
  {
    language: 'spanish',
    books: {
      book_1: 'book1_spanish',
      book_2: 'book2_spanish',
      book_3: 'book3_spanish'
    }
  },
  {
    language: 'italian',
    books: {
      book_1: 'book1_italian',
      book_2: 'book2_italian',
      book_3: 'book3_italian'
    }
  }
];

let targetBook = { book_1: 'book1_spanish' };
let language = 'spanish';
let target = Object.keys(targetBook)[0]; // we only need the 'key' of the targetBook
let result;

function removeTargetBook(books, lan, target) {
  books.forEach(elem => { // some instead of forEach works here as well
    elem.language === lan && (delete elem.books[target]);
  });
  
  return books;
}
// multiple tests for correctness
result = removeTargetBook(books, language, 'fool proof test');
console.log(result);
result = removeTargetBook(books, language, target);
console.log(result);
result = removeTargetBook(books, language, 'book_2');
console.log(result);
result = removeTargetBook(books, language, 'book_3');
console.log(result);