NSArray +从数组中删除项目

时间:2009-11-13 10:46:01

标签: iphone nsarray

如何从NSArray中删除项目。

7 个答案:

答案 0 :(得分:122)

NSArray不可变,也就是说,你无法修改它。你应该看一下NSMutableArray。查看“删除对象”部分,您会发现有许多功能可以删除项目:

[anArray removeObjectAtIndex: index];
[anArray removeObject: item];
[anArray removeLastObject];

答案 1 :(得分:24)

NSMutableArray *arrayThatYouCanRemoveObjects = [NSMutableArray arrayWithArray:your_array];

[arrayThatYouCanRemoveObjects removeObjectAtIndex:your_object_index];

[your_array release];

 your_array = [[NSArray arrayWithArray: arrayThatYouCanRemoveObjects] retain];

就是这样

如果您不拥有您的阵列(即使它是自动释放的),请删除该版本&保留信息

答案 2 :(得分:20)

此类别可能符合您的口味。但!使用它是节俭的;因为我们正在转换为NSMutableArray并再次返回,所以效率并不高。

@implementation NSArray (mxcl)

- (NSArray *)arrayByRemovingObject:(id)obj
{
    if (!obj) return [self copy]; // copy because all array* methods return new arrays
    NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:self];
    [mutableArray removeObject:obj];
    return [NSArray arrayWithArray:mutableArray];
}

@end

答案 3 :(得分:18)

这是使用键值编码的更实用的方法:

@implementation NSArray (Additions)

- (instancetype)arrayByRemovingObject:(id)object {
    return [self filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF != %@", object]];
}

@end

答案 4 :(得分:3)

制作了类似mxcl的类别,但速度稍快一些。

我的测试显示出大约15%的改善(我可能错了,可以自己比较两者)。

基本上我将数组的一部分放在对象前面和后面的部分并将它们组合起来。因此排除元素。

- (NSArray *)prefix_arrayByRemovingObject:(id)object 
{
    if (!object) {
        return self;
    }

    NSUInteger indexOfObject = [self indexOfObject:object];
    NSArray *firstSubArray = [self subarrayWithRange:NSMakeRange(0, indexOfObject)];
    NSArray *secondSubArray = [self subarrayWithRange:NSMakeRange(indexOfObject + 1, self.count - indexOfObject - 1)];
    NSArray *newArray = [firstSubArray arrayByAddingObjectsFromArray:secondSubArray];

    return newArray;
}

答案 5 :(得分:3)

使用以下方法从Object删除NSArray

-(NSArray *) removeObjectFromArray:(NSArray *) array withIndex:(NSInteger) index {
    NSMutableArray *modifyableArray = [[NSMutableArray alloc] initWithArray:array];
    [modifyableArray removeObjectAtIndex:index];
    return [[NSArray alloc] initWithArray:modifyableArray];
}

答案 6 :(得分:0)

正如其他人所建议的那样,NSMutableArray有这样做的方法,但有时您不得不使用NSArray,我会使用:

const fruits = [
  { label: "Apple", value: "Apple" },
  { label: "Orange", value: "Orange" },
  { label: "Mango", value: "Mango" },
  { label: "Grapes", value: "Grapes" },
  { label: "Watermelon", value: "Watermelon" }
];

const selectNames = ["fruitsILove", "fruitsIHate"];

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      fruitsILove: [],
      fruitsIHate: []
    };
  }
  onChange = (value, { name }) => {
    this.setState({
      [name]: value
    });
  };

  trimValues(name) {
    const toRemove = this.state[
      name === "fruitsILove" ? "fruitsIHate" : "fruitsILove"
    ];

    // Depending of your UX you can remove the props or disable it
    // return fruits.filter(val => toRemove.indexOf(val) === -1);

    return fruits.map(val =>
      toRemove.indexOf(val) === -1 ? val : { ...val, isDisabled: true }
    );
  }
  render() {
    return (
      <div className="App">
        {selectNames.map(name => (
          <Select
            isMulti
            key={name}
            name={name}
            onChange={this.onChange}
            options={this.trimValues(name)}
            value={this.state[name]}
          />
        ))}
      </div>
    );
  }
}

这样,oldArray保持原样,但是将创建一个newArray并删除第一个项目。