#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. Спасибо за ваш совет! Я спрашивал об эффективности, потому что у меня, может быть, десять тысяч записей.