Подмножество объектов Json в Javascript

#javascript #arrays #json #subset #slice

Вопрос:

Учитывая массив объектов json, подобных приведенному ниже (объект json, такой как «name2» и «name4», определенно будет иметь только одно значение ключа)

 [
  {
    abc: 123,
    id: '18263322',
    name: 'name1'
  },
  { name: 'name2' },
  {
    abc: 456,
    id: '18421634',
    name: 'name3'
  },
  { name: 'name4' }
]
 

Как я могу подмножить это так, чтобы у меня было два массива объектов json:

 [
  {
    abc: 123,
    id: '18263322',
    name: 'name1'
  },
  {
    abc: 456,
    id: '18421634',
    name: 'name3'
  }
]
 

и

 [
  { name: 'name2' },
  { name: 'name4' }
]
 

Комментарии:

1. Чего именно ты хочешь? Можете ли вы подробнее объяснить свой вопрос? Благодарю

2. использовать Array.prototype.reduce

3. Я хотел бы разделить первый массив (в первом разделе кода) на два массива json. Я использую этот код: data = [ { abc: 123, id: '18263322', name: 'name1' }, { name: 'name2' }, { abc: 456, id: '18421634', name: 'name3' }, { name: 'name4' } ] data.filter(function(x) { console.log(Object.keys(x).length !== 1); }); это дает мне значение true и false, но не сам массив, и обработка кажется очень медленной

4. @SunTianyi, так как вы пробовали, поэтому вы должны включить это в сам вопрос. Чтобы другие люди могли понять, что вы пробовали

Ответ №1:

Вы можете использовать сокращение здесь

 const arr = [
  {
    abc: 123,
    id: "18263322",
    name: "name1",
  },
  { name: "name2" },
  {
    abc: 456,
    id: "18421634",
    name: "name3",
  },
  { name: "name4" },
];

const [single, multiple] = arr.reduce((acc, curr) => {
    Object.keys(curr).length === 1 ? acc[0].push(curr) : acc[1].push(curr);
    return acc;
  },[[], []]
);

console.log(single);
console.log(multiple); 

Вы также можете сделать что-то вроде

 const [single, multiple] = arr.reduce((acc, curr) => {
    acc[Object.keys(curr).length === 1 ? 0 : 1].push(curr);
    return acc;
  },[[], []]);
 

использование фильтра

 const arr = [
  {
    abc: 123,
    id: "18263322",
    name: "name1",
  },
  { name: "name2" },
  {
    abc: 456,
    id: "18421634",
    name: "name3",
  },
  { name: "name4" },
];

const single = arr.filter((o) => Object.keys(o).length === 1);
const multiple = arr.filter((o) => Object.keys(o).length !== 1);

console.log(single);
console.log(multiple); 

Комментарии:

1. Это действует как заклинание! Я думал об Object.keys(x).length этом, но никогда не думал об уменьшении. Большое вам спасибо!

2. @SunTianyi также добавил решение с фильтром. Взглянуть

3. Не могли бы вы прокомментировать, какой из них более эффективен? Я думаю, что сокращение более эффективно, потому что кажется, что оно выполняется только один раз? в то время как второй метод выполняет два цикла фильтров @decpk

4. Вы не должны рассматривать эффективное решение, если набор данных невелик. Если бы в нем были миллионы записей, я бы пошел на сокращение, так как для фильтрации данных требуется один цикл.

5. Спасибо за ваш совет! Я спрашивал об эффективности, потому что у меня, может быть, десять тысяч записей.