从JSON数组中删除字段

3

I have a JSON array:

var arr = [
{ID: "1", Title: "T1", Name: "N1"}, 
{ID: "2", Title: "T2", Name: "N2"}, 
{ID: "3", Title: "T3", Name: "N3"}
]

如何在不使用循环的情况下从所有行中删除Title键?

结果应该如下所示:

var arr = [
{ID: "1", Name: "N1"}, 
{ID: "2", Name: "N2"}, 
{ID: "3", Name: "N3"}
]

我尝试了以下方法:

最初的回答:

delete arr.Title

但它返回的是逻辑值"true"而不是一个数组。

润色后的内容:然而,它返回的结果是一个逻辑值"true",而不是一个数组。


2
那是一个错误的js对象,你是不是想用数组[] - Ele
是的,数组 [{}, ... ] 将编辑问题 - HCMan
1
处理数组本质上是一个迭代的任务。无论是在for循环中显式地进行,还是在mapreduce操作中隐式地进行,它们都是迭代的,或者你所称之为循环周期。为什么有必要使用某种形式的迭代呢?除非这纯粹是学术性的,那就没问题。还有一件事,JSON是对象的字符串表示。你所拥有的是一个对象字面量或对象字面量的数组。true的结果并不是很有帮助。delete {}.abcdefg也会返回true。 - gkelly
6个回答

5

你还没有远到:

[编辑] 带有替代解决方案 结合使用 1) forEach / for..of. 2) delete / Reflect.deleteProperty

let
  arr_1 = [
    {ID: 1, Title: "T1", Name: "N1"}, 
    {ID: 2, Title: "T2", Name: "N2"}, 
    {ID: 3, Title: "T3", Name: "N3"}
  ],
  arr_2 = arr_1.map(e=>Object.assign({},e))  // new array of copies
;

// solution 1
arr_1.forEach(elm=>delete elm.Title)

// solution 2
for(let elm of arr_2){ Reflect.deleteProperty(elm, 'Name') } // changing

console.log('arr_1 =', JSON.stringify(arr_1))
console.log('arr_2 =', JSON.stringify(arr_2))


不确定为什么只有这个版本在JIVE的html tile中起作用?即使是这种情况,我也不得不像这样重新用jQuery编写:var jQuery.each(arr, function(elm, value){ delete value.Title; });其他建议只在jsFiddle中起作用。 - HCMan
forEach是ECMAScript 5的完整JS解释器 => https://caniuse.com/#search=forEach // 我已经修改了我的代码以显示替代解决方案 - Mister Jojo
只是想指出我已经澄清了我的代码,但我想知道它对JIVE是否有用? - Mister Jojo

3
另一种方法是使用函数map创建一个包含所需输出的新数组。在处理程序内部,使用每个索引处的对象创建一个新对象,并最终删除不需要的属性名称Title
假设您指的是数组,这种方法不会改变原始对象。

let arr = [{ID: "1", Title: "T1", Name: "N1"}, {ID: "2", Title: "T2", Name: "N2"}, {ID: "3", Title: "T3", Name: "N3"}],
    result = arr.map(o => {
      let obj = Object.assign({}, o);
      delete obj.Title;
      return obj;
    });

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }


这似乎是目前为止正确的解决方案,你能评估一下它是否需要最少的资源来运行吗? - HCMan
@HCMan:你想要最小化哪些资源?为什么呢? - Scott Sauyet
我正在使用JIVE工作,运行AJAX需要4/5秒的时间,我不想增加响应时间。 - HCMan
不知何故,Object.assign({}, o) 在IE中无法正常工作,我尝试了这个建议,但没有成功:https://dev59.com/dVsW5IYBdhLWcg3wQVNC - HCMan

1

您希望在不使用循环的情况下完成此操作。我不确定您的意思。如果您希望,我们可以编写不明确使用for循环的代码来执行循环。但是,像大多数语言一样(有一些例外,如APL和K),JS没有提供任何直接操作列表元素的方式。因此,您可以使用map抽象出循环。但是,在幕后仍然可能存在一些循环。

var arr = [
  {ID: "1", Title: "T1", Name: "N1"}, 
  {ID: "2", Title: "T2", Name: "N2"}, 
  {ID: "3", Title: "T3", Name: "N3"}
]

const newArr = arr.map(({Title, ...rest}) => ({...rest}))

console.log(newArr)


为什么不使用 map(omit('Title')) 呢? ;) - user3482773
1
@IslamAttrash:很多库都包含omit函数,我个人使用Ramda的,但除非你希望重复使用它,否则在这里引入它没有明显的理由。 - Scott Sauyet

1
对于实际的JSON字符串,JSON.parse复原器参数可用于过滤或修改值:

var json = '[{"ID":"1","Title":"T1","Name":"N1"},{"ID":"2","Title":"T2","Name":"N2"},{"ID":"3","Title":"T3","Name":"N3"}]'

var arr = JSON.parse(json, (k, v) => k != 'Title' ? v : void 0);

console.log( arr );


1
为什么你返回 k[-1]?我猜想在这种情况下你应该返回 undefined。 - EduMelo
1
@EduMelo 这只是一个未定义的快捷方式,因为未定义可以被设置为任何值。 - Slai

0

您的变量arr不是一个数组。它是一个对象。
对象用大括号{}包围,就像这样:{ "name":"Bob", "alive":true, "dead":false }
数组用方括号[]包围,就像这样:["Bob","Jane","Mary]


1
我的答案不再适用。问题已经被编辑过了。 - joshkmartinez
明白了,已经纠正了 - 问题还是一样的,谢谢提醒。 - HCMan

0
你可以使用函数工具来解决问题,这样可以更轻松地完成任务。
import { map, omit } from 'lodash/fp';
const newArr = map(omit('Title'), arr);

2
不鼓励只提供代码的答案。请点击[编辑]并添加一些文字来总结您的代码如何解决问题,或者解释您的答案与之前答案的区别。来自审查 - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接